winform利用委托传值到datagridview_C# Winform 跨多级窗体/控件传值

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

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

下面是实现的效果:

ac592571f8da464f07bf12dea7875ed5.gif
▲ 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 赋值。所以,这里的绑定要放在子窗体构造完毕之后。


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部