【发布时间】:2011-10-24 19:28:18
【问题描述】:
我有一个自定义的用户控件,我想做一些相对简单的事情。
当该用户控件的值发生变化时,让主窗体更新显示窗口。
如果 NUD 不在用户控件中,这不是问题,但我似乎无法弄清楚如何让主窗体而不是用户控件处理事件。
【问题讨论】:
标签: c# winforms user-controls event-handling
我有一个自定义的用户控件,我想做一些相对简单的事情。
当该用户控件的值发生变化时,让主窗体更新显示窗口。
如果 NUD 不在用户控件中,这不是问题,但我似乎无法弄清楚如何让主窗体而不是用户控件处理事件。
【问题讨论】:
标签: c# winforms user-controls event-handling
您需要为用户控件创建一个事件处理程序,当用户控件内的事件被触发时引发。这将允许您将事件沿链向上冒泡,以便您可以处理表单中的事件。
当点击 UserControl 上的 Button1 时,我会触发 Button1_Click,它会在表单上触发 UserControl_ButtonClick:
用户控制:
[Browsable(true)] [Category("Action")]
[Description("Invoked when user clicks button")]
public event EventHandler ButtonClick;
protected void Button1_Click(object sender, EventArgs e)
{
//bubble the event up to the parent
if (this.ButtonClick!= null)
this.ButtonClick(this, e);
}
表格:
UserControl1.ButtonClick += new EventHandler(UserControl_ButtonClick);
protected void UserControl_ButtonClick(object sender, EventArgs e)
{
//handle the event
}
注意事项:
较新的 Visual Studio 版本建议您可以使用 ButtonClick?.Invoke(this, e); 代替 if (this.ButtonClick!= null) this.ButtonClick(this, e);,它的作用基本相同,但更短。
Browsable 属性使事件在 Visual Studio 的设计器(事件视图)中可见,Category 将其显示在“操作”类别中,Description 为其提供描述。您可以完全省略这些属性,但将其提供给设计人员会更舒服,因为 VS 会为您处理。
【讨论】:
UserControl1.ButtonClick += new EventHandler(UserControl_ButtonClick); 部分没有做任何事情。 if (this.ButtonClick!= null) 总是返回 false。
<asp:Button runat="server" OnClick="btnTest_Click" />。否则,您需要在转发器的数据绑定期间找到用户控件并将事件处理程序附加到那里。
尝试映射它。尝试将此代码放入您的UserControl:
public event EventHandler ValueChanged {
add { numericUpDown1.ValueChanged += value; }
remove { numericUpDown1.ValueChanged -= value; }
}
那么您的UserControl 将具有您通常使用NumericUpDown 控件看到的ValueChanged 事件。
【讨论】:
你可以这样做.....下面的例子显示了文本框(用户控件)值的变化
// Declare a delegate
public delegate void ValueChangedEventHandler(object sender, ValueChangedEventArgs e);
public partial class SampleUserControl : TextBox
{
public SampleUserControl()
{
InitializeComponent();
}
// Declare an event
public event ValueChangedEventHandler ValueChanged;
protected virtual void OnValueChanged(ValueChangedEventArgs e)
{
if (ValueChanged != null)
ValueChanged(this,e);
}
private void SampleUserControl_TextChanged(object sender, EventArgs e)
{
TextBox tb = (TextBox)sender;
int value;
if (!int.TryParse(tb.Text, out value))
value = 0;
// Raise the event
OnValueChanged( new ValueChangedEventArgs(value));
}
}
【讨论】:
其中一种简单的方法是使用landa 函数而不会出现任何问题
userControl_Material1.simpleButton4.Click += (s, ee) =>
{
Save_mat(mat_global);
};
【讨论】:
对于那些希望在 VB 中执行此操作的人,这是我使用复选框的方法。
背景:我正在尝试制作我自己的复选框,它是一个滑块/开关控件。我只包含了这个问题的相关代码。
<asp:CheckBox ID="checkbox" runat="server" AutoPostBack="true" />
创建一个事件处理程序(OnCheckChanged)。当用户控件 (MyCheckBox.ascx) 内的控件 (ID="checkbox") 触发事件时,触发 EventHandler (OnCheckChanged)。
Public Event OnCheckChanged As EventHandler
Private Sub checkbox_CheckedChanged(sender As Object, e As EventArgs) Handles checkbox.CheckedChanged
RaiseEvent OnCheckChanged(Me, e)
End Sub
<uc:MyCheckbox runat="server" ID="myCheck" OnCheckChanged="myCheck_CheckChanged" />
注意:直到我在下面添加 Handles 子句后,myCheck_CheckChanged 才会触发
Protected Sub myCheck_CheckChanged (sender As Object, e As EventArgs) Handles scTransparentVoting.OnCheckChanged
'Do some page logic here
End Sub
【讨论】: