C# 委托实例(跨窗体操作控件)

今天研究了一下,在C#里面却是可以不用自定义消息这么复杂的方法来实现跨窗体调用控件,C#有更好的办法就是委托。

效果描述:有两个窗体,FORM1(一个名为“打开form2”的button控件)和FORM2(一个名为“改变form1颜色“的button控件)。启动时,FORM1中点击button控件“打开form2””使FORM2显示出来。点击FORM2中的“改变form1颜色”后,Form1中颜色改变。

一、在Form2里面:
       首先声明一个委托和委托实例
Form2类外

public delegate void ChangeFormColor(bool topmost);

Form2类里

public event ChangeFormColor ChangeColor;

Form2的按钮事件中调用委托

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


二、在Form1里面:
button控件“打开form2“的click事件中有下面的代码:

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

f.ChangeColor += new ChangeFormColor(f_ChangeColor);
这句最关键,你输入到+=之后,按两下Tab,他会自动给你生成回调函数,如下:

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



 三、完整代码

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)
        {
            Form2 f = new Form2();
            f.ChangeColor += new ChangeFormColor(f_ChangeColor);
            f.Show();
        }
        void f_ChangeColor(bool topmost)
        {
            this.BackColor = Color.LightBlue;
            this.Text = "改变成功";
        }
    }
}


 

using System;
using System.Windows.Forms;

namespace 跨窗体调用控件
{
    public delegate void ChangeFormColor(bool topmost);
    public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
        }
        public event ChangeFormColor ChangeColor;
        private void button1_Click(object sender, EventArgs e)
        {
            ChangeColor(true);//执行委托实例
        }
    }
}

 

最后再给大家介绍一种最简单的C#跨窗体操作


Form1类里的代码 public Class1 cla; private void button1_Click(object sender, EventArgs e) { Form2 f2 = new Form2(); f2.Show(); cla.run1(); } private void Form1_Load(object sender, EventArgs e) { cla = new Class1(this,LK); } void LK() { button1.Text = "abc"; } Form2类里的代码 public Class1 cla; void ds() { this.button1.Text = "def"; } private void button1_Click(object sender, EventArgs e) { cla = new Class1(this, ds); cla.run2(); } Class1类里的代码 public delegate void Del1(); public Del1 _del1; public Class1(Form1 f1, Del1 del) { this._del1 = del; } public delegate void Del2(); public Del2 _del2; public Class1(Form2 f2, Del2 del) { this._del2 = del; } public void run1() { Thread th = new Thread(a); th.Start(); } public void run2() { Thread th = new Thread(b); th.Start(); } public void a() { try { _del1();//不为空,可以执行 } catch (Exception e) { MessageBox.Show("a中的方法:\n"+e.ToString ()); } } public void b() { try { _del1();//问题在这,这里委托的方法为空,为什么,上面的怎么不为空? _del2(); } catch (Exception e) { MessageBox.Show("b中的方法:\n" + e.ToString()); } } 问题:在Class1 类里(有注释)。很急,求各位大神帮帮忙。 问题的要义就是在自定义的类里新起一条线程来调用体的控件,我是通过委托的方法执行,但在传这个方法(需要委托的方法)的参数时,在Class1的构造方法中检验是可以传进来的,但调用的时候就为空了。 再次求各位大神帮帮忙。
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页