如何在Usercontrol中创建一个事件并在主窗体中处理它?

时间:2011-10-24 19:28:19

标签: c# winforms user-controls event-handling

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

当usercontrol的值发生变化时,如果数字向上变化,请让主窗体更新显示窗口。

如果NUD不在用户控件中,这不是问题,但我似乎无法弄清楚如何使用mainform而不是用户控件来处理事件。

5 个答案:

答案 0 :(得分:118)

您需要为触发用户控件中的事件时引发的用户控件创建事件处理程序。这将允许您将事件冒泡到链中,以便您可以从表单处理事件。

点击UserControl上的Button1,我会在表单上触发Button1_Click触发UserControl_ButtonClick

用户控制:

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 
}

答案 1 :(得分:19)

尝试映射它。请尝试将此代码放入UserControl

public event EventHandler ValueChanged {
  add { numericUpDown1.ValueChanged += value; }
  remove { numericUpDown1.ValueChanged -= value; }
}

然后,您的UserControl将出现ValueChanged控件通常会看到的NumericUpDown事件。

答案 2 :(得分:11)

你可以这样做.....下面的例子显示文本框(用户控件)值已更改

   // 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)); 
    }    
}

答案 3 :(得分:0)

其中一个简单的方法是使用landa函数,没有像

这样的问题
userControl_Material1.simpleButton4.Click += (s, ee) =>
            {
                Save_mat(mat_global);
            };

答案 4 :(得分:0)

对于那些希望在VB中执行此操作的人,这是我如何使用复选框的方法。

背景:我正在尝试制作自己的复选框,即滑块/开关控件。我只包含了该问题的相关代码。

在用户控件MyCheckbox.ascx中

<asp:CheckBox ID="checkbox" runat="server" AutoPostBack="true" />

在用户控件MyCheckbox.ascx.vb

创建一个EventHandler(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

在页面MyPage.aspx中

<uc:MyCheckbox runat="server" ID="myCheck" OnCheckChanged="myCheck_CheckChanged" />

注意:直到我在下面添加 Handles 子句

后,myCheck_CheckChanged才触发

在页面MyPage.aspx.vb中

Protected Sub myCheck_CheckChanged (sender As Object, e As EventArgs) Handles scTransparentVoting.OnCheckChanged
    'Do some page logic here
End Sub