在父子窗体里分别有个一模一样控件,怎样做到两个控件同步,比如改变子窗体控件里的某个属性值,父窗体里的属性值也跟着变化

解决方案 »

  1.   

    父窗体
    Form2 f2 = new Form2();
    f2.Show(this);
    子窗体
    ((Form1)this.Owner).Controls["textBox1"].Text = this.textBox1.Text;
      

  2.   

    思路:
    1.子窗体的构造函数中增加一个参数,参数类型为窗体类。
    2.为主窗体作一个update的方法,用该方法的参数付给主窗体的某个控件。
    2.在主窗体内生成子窗体的时候,将自己作为子窗体构造构造参数传给子窗体,也就是说子窗体持有以为对主窗体的引用。
    3.在子窗体的某个控件上修改了数据后,调用内部引用的主窗体的update方法,并将数据传入。如果用wpf的话则更简单了:
    主窗体和子窗体都双向绑定到一个静态类的某个字段上,该字段是依赖属性,这种方式下,只要在子窗体内修改了数据,就可以立即反应到主窗体上。
      

  3.   

    同意:
    不过该方法破坏了封装的特性。
    如果Form1上控件的名字改了,或者是需要同步的控件很多的话,这个代码乱的很。
    做一个更新方法全部封装起来,更新方法的参数用一个字典表,字典的关键字可以自己约定为一个参数名,值就是数据。
    这种封装复用性很好。
      

  4.   

    绑定到相同的数据源上即可也就是可以把父窗口的数据源当参数传递给子窗口。只要数据源本身具有InoifyPropryChanged接口,那么他将自动触发同步更新过程实际上微软在msdn上有专门章节说明这个问题
    如何:使用 BindingSource 组件跨窗体共享绑定数据http://msdn.microsoft.com/zh-cn/library/ms404320.aspx
      

  5.   

    用绑定好是好,就是一些复杂的数据(比如,控件的颜色,某个节点是否展开等等)你没办法绑定的,用代码实现无非就是罗嗦点,当相对的,你能获得最大的灵活性,这个要看你的需求了,
    我这边再提供一个思路,供大家讨论:
    Form1是主窗体,Form2是子窗体,在Form2上修改了数据之后通过事件通知Form1,Fomr1在响应该通知事件的处理函数内实现同步(当然了,先要绑定Fomr2的通知函数)。
    通知事件:Form2.DataChanged
    响应: Form1_OnDataChanged(Dictinary<string,object> datas){}
    参数用字典来做,你想同步什么就同步什么。
    这种方法在接口上就把工作量全统一掉了,你的封装性就不会被破坏,工作量就在生成通知的数据和响应工作。