C# 如何在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按钮单

我有一个自定义用户控件,我想做一些相对简单的事情

当该usercontrol的值中的数字上下变化时,让主窗体更新显示窗口


如果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),基本相同,但较短

  • Browsable
    属性使事件在Visual Studio的设计器(事件视图)中可见,
    Category
    将其显示在“操作”类别中,并且
    Description
    为其提供说明。您可以完全忽略这些属性,但让设计师使用这些属性会更舒适,因为VS会为您处理这些属性


尝试映射它。尝试将此代码放入
用户控件中

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