C# 使用委托在两个窗体间实时传值

项目上的情况是这样的:

主窗体的值会实时变化,而子窗体的值要随父窗体的变化而变化。


思路:

主窗体是主动,子窗体被动,由主窗体的改变的事件去调用子窗体的动作函数来改变子窗体。

1.子窗体写执行动作的方法

2.子窗体声明一个委托(在命名空间中,而不在类中)。

3.父窗体实例化子窗体的委托,并想办法将子窗体的执行方法名给委托对象。(父窗体的委托对象就可以知道是哪个执行方法啦)

4.父窗体在主动改变的事件中调用委托对象,并传入值,相当于调用了子窗体的方法,实现子窗体的改变。

步骤1、2是构建发布者;步骤3、4是构建订阅者。


A.子窗体先写方法和声明委托

子窗体写执行动作的方法

子窗体声明一个委托(在命名空间中,而不在类中)。

public delegate void DelegateMethod(string x);
 public void ChangeTime(string x)
        {
            this.Invoke(new Action(() =>
            {
                label1.Text = x;
            }));
        }

第一个代码只是声明了委托(直接在namespace下)而没有实例化,也没有指出是哪个方法的委托。第二个代码是具体的执行方法。


B.主窗体实例化委托,并指定子窗口内的方法,并调用执行。

实例化一个委托对象

 DelegateMethod s;

为了指定s对应的方法,在子窗体生成的时候,指定方法给委托对象s = inTimeDisplay.ChangeTime; 

 public void 实时显示ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            InTimeDisplay inTimeDisplay = new InTimeDisplay();
            s = inTimeDisplay.ChangeTime;           
            inTimeDisplay.Show();
            intimewindowIsOpen = true;
        }

在主窗口值的改变的时候,主动传值给子窗口,并使其改变。由于本例传入的是主窗口的时间,就在主窗口时间改变的时间中将值传入子窗口。

 private void time_TextChanged(object sender, EventArgs e)
        {
            if (intimewindowIsOpen)
            {
                s(time.Text);
            }
            else
            { }
        }

效果:子窗体时间随主窗体变动,同理,可将其他值传入子窗口中。

                                                   


在实际操作中,有以下注意事项:

1.主窗体要知道是否存在子窗体,否则主窗体的主动事件激活子窗体的委托时,如子窗体不存在,将会有未实例化的错误。

2.子窗体关闭后,要告知主窗体,否则也会报错。

我是在主窗体中,写一个全局静态变量,作为子窗体告知主窗体的属性

主窗体定义一个静态变量:

public static bool intimewindowIsOpen = false;

子窗体在关闭时告知主窗体:

private void InTimeDisplay_FormClosing(object sender, FormClosingEventArgs e)
        {
            MainForm.intimewindowIsOpen = false;
        }

 

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页