欢迎访问 生活随笔!

凯发ag旗舰厅登录网址下载

当前位置: 凯发ag旗舰厅登录网址下载 > 编程语言 > c# >内容正文

c#

winform利用委托传值到datagridview-凯发ag旗舰厅登录网址下载

发布时间:2024/10/14 c# 26 豆豆
凯发ag旗舰厅登录网址下载 收集整理的这篇文章主要介绍了 winform利用委托传值到datagridview_c# winform 跨多级窗体/控件传值 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

我们知道 c# winform 跨窗体传值,子父窗体交互一般用委托来实现。之前都是子窗体和父窗体两级交互,如果子窗体再生一个子子窗体,然后子子窗体调用父窗体函数,这样该如何操作?

我想到的实现方式还是用委托变量一级一级的往下传。

下面是实现的效果:

▲ form1 加载 uc1,在 uc1 下加载 uc2,uc2 下返回 uc1

form1.cs

using system;
using system.collections.generic;
using system.componentmodel;
using system.data;
using system.drawing;
using system.linq;
using system.text;
using system.threading.tasks;
using system.windows.forms;

namespace windowsformsapp1
{
    public partial class form1 : form
    {
        public form1()
        {
            initializecomponent();
            this.usercontrol1.loaduserf2 = this.loadfrm;
            this.usercontrol1.action = () => this.button1_click(null, null);
        }

        private usercontrol1 usercontrol1 = new usercontrol1() { dock = dockstyle.fill};

        private void button1_click(object sender, eventargs e)
        {
            this.loadfrm(this.usercontrol1);
        }

        private void loadfrm(control control)
        {
            this.panel1.controls.clear();
            this.panel1.controls.add(control);
        }
    }
}

usercontrol1.cs

using system;
using system.collections.generic;
using system.componentmodel;
using system.drawing;
using system.data;
using system.linq;
using system.text;
using system.threading.tasks;
using system.windows.forms;

namespace windowsformsapp1
{
    public partial class usercontrol1 : usercontrol
    {
        public usercontrol1()
        {
            initializecomponent();
            // this.usercontrol2.backuc1 = this.action; // 放这里,结果都是 null
            // 这个绑定不能放构造函数。因为构造函数执行的时候 action = null。
            // 主窗体先构造好子窗体,然后再给子窗体 action 赋值。
            // 所以,绑定要放在子窗体构造完毕之后。
        }

        private usercontrol2 usercontrol2 = new usercontrol2() { dock = dockstyle.fill };
        public action loaduserf2;public action action;private void button1_click(object sender, eventargs e)
        {this.loaduserf2?.invoke(this.usercontrol2);this.usercontrol2.backuc1 = this.action; // 在这绑定
        }
    }
}

usercontrol2.cs

using system;
using system.collections.generic;
using system.componentmodel;
using system.drawing;
using system.data;
using system.linq;
using system.text;
using system.threading.tasks;
using system.windows.forms;

namespace windowsformsapp1
{
    public partial class usercontrol2 : usercontrol
    {
        public usercontrol2()
        {
            initializecomponent();
        }

        public action backuc1;

        private void button1_click(object sender, eventargs e)
        {
            backuc1?.invoke();
        }
    }
}

要注意的地方:

在 usercontrol1.cs 中的注释中说明。这里的委托绑定不能放在构造函数下,因为构造函数执行的时候 action = null。

主窗体先构造好子窗体,然后再给子窗体 action 赋值。所以,这里的绑定要放在子窗体构造完毕之后。

总结

以上是凯发ag旗舰厅登录网址下载为你收集整理的winform利用委托传值到datagridview_c# winform 跨多级窗体/控件传值的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得凯发ag旗舰厅登录网址下载网站内容还不错,欢迎将凯发ag旗舰厅登录网址下载推荐给好友。

网站地图