C# 如何在Usercontrol中创建事件并在主窗体中处理它?
我有一个自定义用户控件,我想做一些相对简单的事情 当该usercontrol的值中的数字上下变化时,让主窗体更新显示窗口C# 如何在Usercontrol中创建事件并在主窗体中处理它?,c#,winforms,user-controls,event-handling,C#,Winforms,User Controls,Event Handling,我有一个自定义用户控件,我想做一些相对简单的事情 当该usercontrol的值中的数字上下变化时,让主窗体更新显示窗口 如果NUD不在usercontrol中,这不是问题,但我似乎不知道如何让事件由mainform而不是usercontrol处理。您需要为用户控件创建一个事件处理程序,当用户控件中的事件被触发时,该事件处理程序将被触发。这将允许您在链上冒泡事件,以便可以从表单处理事件 在用户控件上单击Button1时,我将触发Button1\u单击,触发表单上的UserControl\u按钮单
如果NUD不在usercontrol中,这不是问题,但我似乎不知道如何让事件由mainform而不是usercontrol处理。您需要为用户控件创建一个事件处理程序,当用户控件中的事件被触发时,该事件处理程序将被触发。这将允许您在链上冒泡事件,以便可以从表单处理事件 在用户控件上单击
Button1
时,我将触发Button1\u单击
,触发表单上的UserControl\u按钮单击
:
用户控制:
[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);
}
表格:
注意事项:
- 较新的Visual Studio版本建议使用this.ButtonClick!=null代替
if(this.ButtonClick!=null)this.ButtonClick(this,e)代码>您可以使用
按钮单击?.Invoke(this,e)代码>,基本相同,但较短
属性使事件在Visual Studio的设计器(事件视图)中可见,Browsable
将其显示在“操作”类别中,并且Category
为其提供说明。您可以完全忽略这些属性,但让设计师使用这些属性会更舒适,因为VS会为您处理这些属性Description
用户控件中
:
public event EventHandler ValueChanged {
add { numericUpDown1.ValueChanged += value; }
remove { numericUpDown1.ValueChanged -= value; }
}
然后您的
UserControl
将有ValueChanged
事件,您通常会看到NumericUpDown
控件。您可以这样做…..下面的示例显示文本框(用户控件)值已更改
// 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中实现这一点的人,下面是我如何让我的复选框工作的 背景:我试图制作自己的复选框,它是一个滑块/开关控件。我只包含了这个问题的相关代码 在用户控件MyCheckbox.ascx中 在页面MyPage.aspx中
可能的重复项在此处不使用new关键字。我很难在repeater控件内的用户控件实例上使用此项,repeater控件在OnItemDatabound事件上生成这些实例。这就好像
UserControl1.ButtonClick+=neweventhandler(UserControl\u ButtonClick)代码>部件未执行任何操作如果(this.ButtonClick!=null)
总是返回false。@鱼鹰:在中继器内部,您可能希望以声明方式在标记中添加处理程序,例如
。否则,您需要在中继器的数据绑定过程中找到用户控件,并将事件处理程序附加到那里。工作起来很神奇
userControl_Material1.simpleButton4.Click += (s, ee) =>
{
Save_mat(mat_global);
};
<asp:CheckBox ID="checkbox" runat="server" AutoPostBack="true" />
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" />
Protected Sub myCheck_CheckChanged (sender As Object, e As EventArgs) Handles scTransparentVoting.OnCheckChanged
'Do some page logic here
End Sub