[英]How to override button click in c# (winForms)?
让我从示例开始:我有一个名为“btnTest”的按钮的Form
,并_click
添加了_click
事件。
private void btnTest_Click(object sender, EventArgs e)
{
MessageBox.Show("button click");
}
现在我想使用Control
类为这个button
动态生成另一个_click
事件,因此覆盖现有的event_hendler
,所以我的表单看起来像这样:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
Control[] controls = Controls.Find("btnTest", true); //find control by name
controls[0].Click += Form1_Click; //generate button click
}
private void Form1_Click(object sender, EventArgs e)
{
MessageBox.Show("control click"); //want to be displayed
}
private void btnTest_Click(object sender, EventArgs e)
{
MessageBox.Show("button click"); //don't want to be displayed
}
}
所以我的目标是启用Form1_Click
并忽略btnTest_Click
并在代码中动态执行此操作。 做了一些研究,但无法得到答案。
我为什么要这样做?
我的主要目标是使用ENTER关键字而不是TAB来浏览控件,所以当我偶然发现按钮时,我只想向前移动而不触发原始事件。
请注意, btnTest_Click
事件在Form1_Click
事件之前触发,而且不好的解决方案是直接在btnTest_Click
执行某些操作,因为我想使用ENTER导航的控件数量有限,并且帽子是可变的,因此我想忽略的按钮将在controls
数组。
任何建议都是有帮助的,感谢您的时间。
您如何看待这种方法
Control control = Controls.Find("btnTest", true).FirstOrDefault(); //find control by name
if(control != null)
{
btnTest.Click -= btnTest_Click; //Remove Default Event Handler.
control.Click += Form1_Click; //generate button click
}
尝试这个:
controls[0].Click += Form1_Click;
controls[0].Click -= btnTest_Click;
经过一番努力和研究,我设法找到了解决方案。 我的逻辑是在controls[0].Click += Form1_Click;
之前删除所有事件处理controls[0].Click += Form1_Click;
这将是覆盖原始事件的方法。 尝试过这样的事情
controls[0].Click += null;
controls[0].Click += Form1_Click;
但它不起作用,所以我根据这个答案找到了解决方案,我的论坛看起来像这样:
public Form1()
{
InitializeComponent();
InitializeComponent();
Control[] controls = Controls.Find("btnTest", true); //find control by name
Button btn = controls[0] as Button; //safe cast as Button
RemoveClickEvent(btn);
controls[0].Click += Form1_Click; //generate button click
}
private void Form1_Click(object sender, EventArgs e)
{
MessageBox.Show("control click");
}
private void btnTest_Click(object sender, EventArgs e)
{
MessageBox.Show("button click");
}
//remove all event hendlers for button
private void RemoveClickEvent(Button b)
{
FieldInfo f1 = typeof(Control).GetField("EventClick",
BindingFlags.Static | BindingFlags.NonPublic);
object obj = f1.GetValue(b);
PropertyInfo pi = b.GetType().GetProperty("Events",
BindingFlags.NonPublic | BindingFlags.Instance);
EventHandlerList list = (EventHandlerList)pi.GetValue(b, null);
list.RemoveHandler(obj, list[obj]);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.