如何在用户控件中创建事件并在主窗体中处理它?


Answers:


140

您需要为用户控件创建事件处理程序,该事件处理程序在触发用户控件内的事件时引发。这将使您能够在事件链上冒泡,以便可以从表单中处理事件。

当点击Button1UserControl时,我将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版本建议if (this.ButtonClick!= null) this.ButtonClick(this, e);您代替使用ButtonClick?.Invoke(this, e);,它的作用基本相同,但更短。

  • Browsable属性使事件在Visual Studio的设计器(事件视图)中可见,Category并在“操作”类别中显示该事件,并Description提供对其的描述。您可以完全省略这些属性,但是由于VS为您处理,因此将其提供给设计者使用起来更加舒适。


我很难让它在转发器控件内的用户控件实例上起作用,该控件在OnItemDatabound事件上生成它们。好像UserControl1.ButtonClick += new EventHandler(UserControl_ButtonClick);零件什么也没做。if (this.ButtonClick!= null)始终返回false。
鱼鹰

1
@Osprey:在中继器内部,您可能希望在标记中声明性地添加处理程序,例如<asp:Button runat="server" OnClick="btnTest_Click" />。否则,您将需要在转发器的数据绑定期间找到用户控件,并将事件处理程序附加在那里。
James Johnson

24

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

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

那么您UserControl将拥有ValueChanged通常在NumericUpDown控件中看到的事件。


1
不要在这里使用new关键字。
汉斯·帕桑

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

0

一种简单的方法是使用Landa函数,而不会出现任何问题

userControl_Material1.simpleButton4.Click += (s, ee) =>
            {
                Save_mat(mat_global);
            };

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.