WinForms:将数据从用户控件传递到其父窗体

问题描述 投票:0回答:1

我有一个表单和一个用户控件。我尝试将数据从用户控件传递到表单。 当用户与用户控件交互时,用户控件的变量值会发生更改,并且会引发窗体正在侦听的事件。我希望表单在标签中显示该变量的当前值。

我为表单实现了一个事件、一个委托和事件处理程序,只要表单在消息框中显示当前值,它就可以工作。 但是,当我希望它显示在表单上的标签中时,它不起作用,因为事件处理程序是静态的,当我尝试将新值应用于标签时,处理程序内没有对它的引用。

另一种方法可能是首先通过事件传输值 - 我想这会更好,因为这样变量可以实现为私有的,但我不知道如何在事件上加载变量。

有人可以帮我吗?我以前从未处理过自写事件,我不知道如何继续。

这是表格:

using System.Windows.Forms;

namespace Events
{
    public partial class Form1 : Form
    {
        // Delegate
        public delegate void MyUserControlEventHandler(MyUserControl sender);

        public Form1()
        {
            InitializeComponent();
        }

        // EventHandler
        public static void Form1_ListenToChanges(MyUserControl sender)
        {             
            MessageBox.Show("Value was changed. Current value: " + sender.value.ToString());
            //The following will not work:
            //label1.Text = sender.value.ToString();
        }
    }
}

这是用户控件:

using System;
using System.Windows.Forms;
using static Events.Form1;

namespace Events
{
    public partial class MyUserControl : UserControl
    {
        public int value;

        // Event
        public event MyUserControlEventHandler Value_Change;
        
        public MyUserControl()
        {
            InitializeComponent();
            Value_Change += new MyUserControlEventHandler(Form1_ListenToChanges);
        }

        private void button1_Click(object sender, EventArgs e)
        {
            value++;
            // Raise event
            if(Value_Change != null) Value_Change(this);
        }
    }
}
c# winforms events
1个回答
0
投票

事件处理程序不应该是静态的。

public void Form1_ListenToChanges(MyUserControl sender)

并且事件订阅应该在

Form1
类中进行。

public Form1()
{
    // ...
    this.myUserControl.Value_Change += this.Form1_ListenToChanges;
}

Form1
有一个
MyUserControl
,对吧?上面的代码片段假设它有,并且它是
this.myUserControl
。)

(然后您可以将事件处理程序设为私有。)

private void Form1_ListenToChanges(MyUserControl sender)
© www.soinside.com 2019 - 2024. All rights reserved.