• 使用委托(事件)或中介设计模式实现多个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;
            }
        }
    
    • 注释掉的部分就是用事件实现,代码和委托差不多,区别在于事件更安全,因为事件只能在本类内部调用,而委托可以在其他类中调用。
  • 相关阅读:
    react Table key值使用方式
    C# EF查询不同分组的第一条数据
    C# MVC PDFJS URL传参方式+文件流方式在线展示文档
    docker nginx配置写错,启动不了容器的解决方案
    网络编程之BIO和NIO
    网络编程之BIO和NIO
    IT职场心得感想
    我们希望能与各位快乐拼博的站长们一路前行
    UART, SPI详解
    创业精神
  • 原文地址:https://www.cnblogs.com/Godfunc/p/6709136.html
Copyright © 2020-2023  润新知