我有一个表单和一个用户控件。我尝试将数据从用户控件传递到表单。 当用户与用户控件交互时,用户控件的变量值会发生更改,并且会引发窗体正在侦听的事件。我希望表单在标签中显示该变量的当前值。
我为表单实现了一个事件、一个委托和事件处理程序,只要表单在消息框中显示当前值,它就可以工作。 但是,当我希望它显示在表单上的标签中时,它不起作用,因为事件处理程序是静态的,当我尝试将新值应用于标签时,处理程序内没有对它的引用。
另一种方法可能是首先通过事件传输值 - 我想这会更好,因为这样变量可以实现为私有的,但我不知道如何在事件上加载变量。
有人可以帮我吗?我以前从未处理过自写事件,我不知道如何继续。
这是表格:
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);
}
}
}
事件处理程序不应该是静态的。
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)