我有一个自定义的用户控件,我想做一些相对简单的事情。
每当该用户控件的值上下数字更改时,请使主窗体更新显示窗口。
如果NUD不在用户控件中,那么这不是问题,但是我似乎无法弄清楚如何由主窗体而不是用户控件来处理事件。
Answers:
您需要为用户控件创建事件处理程序,该事件处理程序在触发用户控件内的事件时引发。这将使您能够在事件链上冒泡,以便可以从表单中处理事件。
当点击Button1
UserControl时,我将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为您处理,因此将其提供给设计者使用起来更加舒适。
UserControl1.ButtonClick += new EventHandler(UserControl_ButtonClick);
零件什么也没做。if (this.ButtonClick!= null)
始终返回false。
<asp:Button runat="server" OnClick="btnTest_Click" />
。否则,您将需要在转发器的数据绑定期间找到用户控件,并将事件处理程序附加在那里。
您可以这样做.....下面的示例显示文本框(用户控件)的值已更改
// 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));
}
}
对于那些希望在VB中执行此操作的人,这是我如何使用复选框的方法。
背景:我试图创建自己的复选框,即滑块/开关控件。我只包含了与此问题相关的代码。
<asp:CheckBox ID="checkbox" runat="server" AutoPostBack="true" />
创建一个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
<uc:MyCheckbox runat="server" ID="myCheck" OnCheckChanged="myCheck_CheckChanged" />
注意:直到我在下面添加了Handles子句后,myCheck_CheckChanged才触发
Protected Sub myCheck_CheckChanged (sender As Object, e As EventArgs) Handles scTransparentVoting.OnCheckChanged
'Do some page logic here
End Sub