如题:
窗体保存指——我的Winform程序运行后,点击“保存”,然后整个窗体内的东西(包括框架、控件、事件、还有属性等等)全部写入数据库。窗体还原指——点击打开,就从数据库中把刚刚保存的那些东东拿出来,然后用这些东西还原成一模一样的窗体。怎么实现?给个思路也行啊!

解决方案 »

  1.   

    就是说可以写一个比如叫settings类里面有很多字段,比如窗口里有个checkbox1处于选中状态那么我将这个类的字段settings.checkbox1checked = 1,这样保存的时候将settings类串行化可以方便的保存到数据库里,读出的时候反串行化settings,然后再窗体的构造函数或者那个初始化函数里将这些设置还原到窗口中比如checkbox1.checked = settings.checkbox1checked;我就是这个意思。
    不知道有没有什么模式能实现搂主要的功能,对设计模式不太熟,楼主参考楼下高论
      

  2.   

    就是说可以写一个比如叫settings类里面有很多字段:
    **********************
    这个的确没搞懂。关键是,我还不知道这个类要写多大的规模,因为我的窗体运行后,窗体里有多少孔件、控件的类型、数量、属性(同种控件的属性都可能不一致)等等都可能变化。这个该怎么写?有办法写吗?
      

  3.   

    这个比较麻烦
    如果你的窗口比较简单就文本框,按钮等常规控件还好说 子要循环判断控件的位置,text,背景色什么的放到一个 什么hastable 或 类里就可以,
    还原的时候利用反射找控件名 把数据还原回去如果还有一些,DataGrid listView treeView 或一些第3方控件
    那就郁闷了,尤其是DataGrid 和一些第3方的控件
    子对象不说一万业有一千而且很多是 private 的字段,你想设置回去也难而且有些时候不见得都是控件还有其他控件如 WebService 客户端,一些常量等
    都保存是不可能的子可以有选择的保存。
      

  4.   

    FlashElf(銘龘鶽):
        如你所说,控件的类型也不会太多。主要是文本框、图片框、Panel等6种左右,都不会太复杂吧。
      

  5.   

    还是用xml来保存,不过你这样做的目的是什么?
      

  6.   

    我觉得如果仅保存窗口的外观应该不难,如果想恢复到和原来一模一样可能不是太行,你应该只能记录窗体及子窗体打开时的外观,而运行时信息肯定会丢失,因为运行时信息需要你记录APPLICATION的所有(部分)动作,这也许可行,但是否会台消耗资源。
      

  7.   

    呵呵,问题是,Form好象不支持序列化。那这样吧。比如我在窗体内放置一个容器控件。我的程序运行后,要求,这个容器内可以随意放置一些控件,就我刚才说得那6-7个控件。然后有办法把这个容器(比如Panel)内的东西写到数据库中,并在需要时,再写回窗体,恢复成保存时的摸样吗?
      

  8.   

    这个需要你自己写序列化了(以前用VC ini 文件都可以写出来怎么C# 还不能实现?)
    子不过没现成的罢了!
    循环窗口全部的 控件然后以类似的方式保存成xml
    树形
    <TestForm>
       <ctls>
           <TextBox name="textBox1"><Text>文本1<Text></TextBox>
           <TextBox name="textBox2"><Text>文本2<Text></TextBox>
           <Panel name="panel1">
             <ctls>
                 <CheckBox name="chkBox1"><Checked>true</Checked></CheckBox>
                 <CheckBox name="chkBox2"></CheckBox>
             <ctls>
           </Panel>
           <Button name="button1"><Text>确定<Text></Button>
           <Button name="button2"><Text>取消<Text></Button>
       <ctls>
    </TestForm>
      

  9.   

    如果是有事件的话就不知道了,我想就算有事件对应保存的摸板而言那个“事件”也应该只是该控件的某个属性的值而已,那真正的事件的实现应该是你那个设计器所解释的吧
    我老大就做了一个这样的东西,他是用XML保存所有界面信息,而事件全是事先定义好的,然后解释。对于某写东西也用了即时编译。他的大体框架是改造sharpdevelop (http://www.icsharpcode.net/OpenSource/SD/Default.aspx)