使用委托(事件)或中介设计模式实现多个Windows窗体文本框的同步

需求

  • 主窗体的文本框内容发生改变的时候,多个子窗体的文本框也发生改变。

中介设计模式

实现

  • 当主窗体的文本框内容发生改变的时候,通过接口向所有实现这个接口的窗体发送一条消息(执行接口中的方法),从而实现同步。

主窗体代码:

public partial class parentFrm : Form
    {
        private List<IMessage> list = new List<IMessage>();
        public parentFrm()
        {
            InitializeComponent();
        }

        public void setText(string text)
        {
            this.tb.Text = text;
        }
        private void button1_Click(object sender, EventArgs e)
        {
            ChildFrm1 frm = new ChildFrm1();
            list.Add(frm);
            frm.Show();

            ChildFrm2 frm2 = new ChildFrm2();
            list.Add(frm2);
            frm2.Show();

            ChildFrm3 frm3 = new ChildFrm3();
            list.Add(frm3);
            frm3.Show();
        }
        private void tb_TextChanged(object sender, EventArgs e)
        {
            foreach (IMessage Msg in list)
            {
                Msg.onMessage(this.tb.Text);
            }
        }
    }

子窗体(由于子窗体基本上一样,在这里就只写一个)

public partial class ChildFrm1 : Form,IMessage
    {
        public ChildFrm1()
        {
            InitializeComponent();
        }
        public void onMessage(string str)
        {
            this.textBox1.Text = str;
        }
    }

接口

interface IMessage
    {
        void onMessage(string str);
    }
  • 主窗体将所有需要同步文本内容的子窗体都添加到一个IMessage集合中,然后当主窗体的文本框中内容发生改变的时候,遍历这个集合,执行onMessage()方法,修改子窗体文本框中的内容。
  • IMessage这个接口就是一个中介。

委托设计模式

实现:

  • 创建一个接口,接口里面写一个设置文本框内容的方法,然后让子窗体实现这个接口,在主窗体中声明一个委托,这个委托用来装接口中的这个方法,然后实例化这个委托,子窗体创建的时候,把所有子窗体中实现的接口中的方法给委托实例,然后在主文本框发生改变的这个方法中执行这个委托。

代码

  • 主窗体
    public delegate void delSendMessage(string str);

    public partial class Form1 : Form
    {
        //事件
        public event delSendMessage sendMessageEvent;
        public delSendMessage sendMessage { get; set; }
        public Form1()
        {
            InitializeComponent();
        }
        private void button1_Click(object sender, EventArgs e)
        {
            ChildFrm1 frm1 = new ChildFrm1();
            //this.sendMessageEvent += frm1.setText;
            this.sendMessage += frm1.setText;
            frm1.Show();

            ChildFrm2 frm2 = new ChildFrm2();
            //this.sendMessageEvent += frm2.setText;
            this.sendMessage += frm2.setText;
            frm2.Show();

            ChildFrm3 frm3 = new ChildFrm3();
            //this.sendMessageEvent += frm3.setText;
            this.sendMessage += frm3.setText;
            frm3.Show();
            
        }
        private void textBox1_TextChanged(object sender, EventArgs e)
        {
            sendMessage.Invoke(this.textBox1.Text);
            //sendMessageEvent(this.textBox1.Text);
        }
    }
  • 子窗体
public partial class ChildFrm2 : Form,ISetText
    {
        public ChildFrm2()
        {
            InitializeComponent();
        }

        public void setText(string str)
        {
            this.textBox1.Text = str;
        }
    }
  • 注释掉的部分就是用事件实现,代码和委托差不多,区别在于事件更安全,因为事件只能在本类内部调用,而委托可以在其他类中调用。
posted @ 2017-04-14 15:34  Godfunc  阅读(307)  评论(0编辑  收藏  举报