C# 窗体 winform 委托实例

1.委托相关总结

好处:1.可以避免在程序中大量使用If-Else(Switch)语句, 通过委托示列来实现
2.同时使得程序具有更好的可扩展性
什么时候用?委托自定义事件,回调,匿名委托,线程访问主线程组件等等

2.委托程序流程

1 B中声明一个委托 :命令空间中

public delegate void ChangeFormColor(bool topmost);  

2 B中实例化一个委托:class B中

public event ChangeFormColor ChangeColor;   
 // public  ChangeFormColor ChangeColor; 

3.1 A中添加(订阅)委托的事件

Form2 f = new Form2();  
f.ChangeColor += new ChangeFormColor(f_ChangeColor);

3.2 A中具体委托事件的实现

void f_ChangeColor(bool topmost)  
{  
	this.BackColor = Color.LightBlue;  
	this.Text = "改变成功";  
}  

4 B中调用委托,就OK了(必须A中有订阅委托)

private void button1_Click(object sender, EventArgs e)  
{  
    ChangeColor(true);//执行委托实例  
} 

3.1具体实例: Form1打开Form2,Form2改变Form1颜色

Form1(父)中:

using System;  
using System.Drawing;  
using System.Windows.Forms;  
  
namespace 跨窗体调用控件  
{  
    public partial class Form1 : Form  
    {  
        public Form1()  
        {  
            InitializeComponent();  
        }  
        private void button1_Click(object sender, EventArgs e)  
        {  
        	//3.1 Form1中添加(订阅)委托的事件 
            Form2 f = new Form2();  
            f.ChangeColor += new ChangeFormColor(f_ChangeColor);
              
            f.Show();  
        }  
        //3.2 Form2中具体委托事件的实现
        void f_ChangeColor(bool topmost)  
        {  
            this.BackColor = Color.LightBlue;  
            this.Text = "改变成功";  
        }  
    }  
}  

Form2(子)中

using System;  
using System.Windows.Forms;  
  
namespace 跨窗体调用控件  
{  
	//1 Form2中声明一个委托 :命令空间中
    public delegate void ChangeFormColor(bool topmost);  
    public partial class Form2 : Form  
    {  
        public Form2()  
        {  
            InitializeComponent();  
        }  
        //2 Form2中实例化一个委托:class B中 
        public event ChangeFormColor ChangeColor;  
        private void button1_Click(object sender, EventArgs e)  
        {  
        	//4 Form2中调用委托,就OK了(必须A中有订阅委托)
            ChangeColor(true);//执行委托实例  
        }  
    }  
}  

在这里插入图片描述
链接: C# 委托实例(跨窗体操作控件).

3.2 Form1打开Form2,Form2传递值给Form1

Form1中:

using System;
using System.Windows.Forms;

namespace WindowsForms 跨窗体传值大全
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        
        private void button1_Click(object sender, EventArgs e)
        {
            //3.1 Form1中添加(订阅)委托的事件
            Form2 f2 = new Form2();
            f2.ChangeText += new ChangeTextHandler(Change_Text);//将事件和处理方法绑在一起,这句话必须放在f2.ShowDialog();前面

            f2.ShowDialog();            
        }

        //3.2 Form1中具体委托事件的实现
        public void Change_Text(string str)
        {
            textBox1.Text = str;
        }  
    }
}

Form2中

using System;
using System.Windows.Forms;

namespace WindowsForms跨窗体传值大全
{
    //1. Form2中声明一个委托,命令空间中
    public delegate void ChangeTextHandler(string str);  

    public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
        }

        //2. Form2中B中实例化一个委托,class Form2中
        public event ChangeTextHandler ChangeText;  

        private void button2_Click(object sender, EventArgs e)
        {
            //4 Form2中调用委托,就OK了(必须A中有订阅委托)
            if (ChangeText != null)//判断事件是否为空
            {
                ChangeText(textBox2.Text);//执行委托实例  
                this.Close();
            }           
        }    
    }
}

在这里插入图片描述
链接: C#跨窗体传值的几种方法分析(很详细).

发布了14 篇原创文章 · 获赞 9 · 访问量 1580

猜你喜欢

转载自blog.csdn.net/qq_16504163/article/details/104244722