我有一个自定义的用户控件,想要实现相对简单的功能。
每当该用户控件中的数字微调框的值发生变化时,让主窗体更新显示窗口。
如果数字微调框不在用户控件中,这并不是问题,但是我似乎无法弄清如何让事件由主窗体处理而不是用户控件处理。
我有一个自定义的用户控件,想要实现相对简单的功能。
每当该用户控件中的数字微调框的值发生变化时,让主窗体更新显示窗口。
如果数字微调框不在用户控件中,这并不是问题,但是我似乎无法弄清如何让事件由主窗体处理而不是用户控件处理。
[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会代表您处理它们。
UserControl1.ButtonClick += new EventHandler(UserControl_ButtonClick);
这一部分没有起作用。if (this.ButtonClick!= null)
总是返回false。 - Osprey<asp:Button runat="server" OnClick="btnTest_Click" />
。否则,在重复器的数据绑定期间,您需要找到用户控件并在那里附加事件处理程序。 - James Johnson尝试映射它。 将此代码放置在您的UserControl
中:
public event EventHandler ValueChanged {
add { numericUpDown1.ValueChanged += value; }
remove { numericUpDown1.ValueChanged -= value; }
}
然后你的UserControl
将具有NumericUpDown
控件通常显示的ValueChanged
事件。
您可以这样做......以下示例显示文本框(用户控件)的值已更改
// 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));
}
}
其中一种简单的方法是使用Lambda函数,没有任何问题。
userControl_Material1.simpleButton4.Click += (s, ee) =>
{
Save_mat(mat_global);
};
对于那些想在VB中实现此操作的人,这是我如何使用复选框使其工作的方法。
背景:我正在尝试制作自己的复选框,它是一个滑块/开关控件。我仅包括了与此问题相关的代码。
<asp:CheckBox ID="checkbox" runat="server" AutoPostBack="true" />
创建一个事件处理程序(OnCheckChanged)。当您的用户控件(MyCheckBox.ascx)内部的控件(ID="checkbox")触发事件时,触发您的事件处理程序(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" />
Protected Sub myCheck_CheckChanged (sender As Object, e As EventArgs) Handles scTransparentVoting.OnCheckChanged
'Do some page logic here
End Sub