【问题标题】:How do I make an Event in the Usercontrol and have it handled in the Main Form?如何在用户控件中创建一个事件并在主窗体中处理它?
【发布时间】:2011-10-24 19:28:18
【问题描述】:

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

当该用户控件的值发生变化时,让主窗体更新显示窗口。

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

【问题讨论】:

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


【解决方案1】:

您需要为用户控件创建一个事件处理程序,当用户控件内的事件被触发时引发。这将允许您将事件沿链向上冒泡,以便您可以处理表单中的事件。

当点击 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 会为您处理。

【讨论】:

  • 我无法让它在 OnItemDatabound 事件上生成它们的转发器控件内部的用户控件实例上工作。就好像UserControl1.ButtonClick += new EventHandler(UserControl_ButtonClick); 部分没有做任何事情。 if (this.ButtonClick!= null) 总是返回 false。
  • @Osprey:在中继器内部,您可能希望在标记中以声明方式添加处理程序,例如<asp:Button runat="server" OnClick="btnTest_Click" />。否则,您需要在转发器的数据绑定期间找到用户控件并将事件处理程序附加到那里。
【解决方案2】:

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

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

那么您的UserControl 将具有您通常使用NumericUpDown 控件看到的ValueChanged 事件。

【讨论】:

  • 这里不要使用 new 关键字。
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

      【解决方案5】:

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

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

      在用户控件 MyCheckbox.ascx 中

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

      在用户控件 MyCheckbox.ascx.vb

      创建一个事件处理程序(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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多