繁体   English   中英

如何覆盖 c# (winForms) 中的按钮单击?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM