现在有一个Winform项目,有三个窗体(非父窗体与子窗体)各自有一个textbox控件,如何实现当我更新其中一个窗体控件内容时,其它两个窗体控件内容也一起更新。

解决方案 »

  1.   

    不用委托事件也行。
    三个窗体的TextBox统一命名为TextBox1,并且TextChanged事件:
    private void textBox1_TextChanged(object sender, EventArgs e)
    {
         foreach (Form frm in ((Form)this.MdiParent).MdiChildren)
         {
             ((TextBox)frm.Controls.Find("TextBox1", true)[0]).Text = this.textBox1.Text;
         }
    }
      

  2.   


    内容  此内容为对象看待该对象 后台用deep copy来做
    这样可以达到联动的效果
      

  3.   

    数据绑定可以实现。winform好久没碰了。关键字:INotifyPropertyChanged, BindingSource.包含基础数据的那个实体类至少实现INotifyPropertyChanged这个接口,这个好像是到了WPF也适用的一个规则。楼主就简单这么想像吧:实现INotifyPropertyChanged的那个类的对象的属性值一旦发生变化,那么所有绑定到这个类的对象集合(或这个类的对象本身)的界面都会自动改变以反应变化。这是一种机制。winform/WPF的控件一旦绑定到实现了INotifyPropertyChanged的数据时会自动的某个这个事件。具体的有点想不起来了。突然想到TMD asp.net有个类似的机制该多TM爽啊!老是TMD Postback的烦死了!
      

  4.   

    这个不难吧,创建一个性质
    public class Tools
    {
      private string m_TextBoxValue="";
       public static string TextBoxValue
      {
         get
         {
           return m_TextBoxValue;
         }
         set
          {
                m_TextBoxValue=value;
              if(myForm1.TextBox1.Text!=m_TextBoxValue}
                 myForm1.TextBox1.Text=m_TextBoxValue;
              if(myForm2.TextBox1.Text!=m_TextBoxValue}
                 myForm2.TextBox1.Text=m_TextBoxValue;
             if(myForm1.TextBox3.Text!=m_TextBoxValue}
                 myForm1.TextBox3.Text=m_TextBoxValue;
          }
    }意思就是这个意思,当然,你还要设置为各窗口中TextBox属性为public ,或者通过“性质”让Tools能访问,如
    public MyTextBox
    {
       get
       {
         return this.textbox1;
      }
    }
    这样,虽然textbox1为private的,但Tools仍然能访问
    另外,还要判断myform是否存在,这都是相关细节了,任何一个窗口的文本框内容发生改变时,都调用一下:
    Tools.TextBoxValue=新的值,一定要if(myForm1.TextBox1.Text!=m_TextBoxValue}
                 myForm1.TextBox1.Text=m_TextBoxValue;这种方式,即先判断,如果不等,才赋值,否则,容易引起死循环