【问题标题】:basic button handler needs 2 clicks to actually work基本按钮处理程序需要单击 2 次才能实际工作
【发布时间】:2017-08-03 14:07:44
【问题描述】:

这是我在这里的第一篇文章...我进行了搜索,但我找不到这个基本问题的解决方案(仍然是 C# 新手。抱歉,感谢您的帮助):这个基本的按钮处理程序需要点击 2 次才能真正工作...

//button script
private void btnHp1_Click(object sender, EventArgs e)
{btnHp1.Click += new EventHandler(btnTest_Click);}  

//handler for all buttons
void btnTest_Click(object sender, EventArgs e)        
{
Button button = sender as Button;
MessageBox.Show(button.Name);
}

【问题讨论】:

  • 在表单的构造函数中或通过设计器添加事件处理程序。
  • btnHp1_Click 是您的点击处理程序。您在这里所做的只是使用您的处理程序连接另一个处理程序。在第二次单击时,您将触发btnHp1_Click(再次),连接btnTest_Click(再次)并触发btnTest_Click。您的第三次点击可能最终会触发两次btnTest_Click
  • 谢谢布拉德利(以及所有),你是对的。您的代码可以解决问题。我想我也应该听从马特的建议。

标签: c# winforms events button eventhandler


【解决方案1】:

从编写函数的方式来看,您可能打算从btnHp1_Click 内部调用 btnTest_Click,而不是附加另一个处理程序。

如果是这样,代码应该是这样的:

//button script
private void btnHp1_Click(object sender, EventArgs e)
{
   btnTest_Click(btnHp1, e);
}

这个函数的作用,基本上是将点击事件从btnHp1转发到btnTest,覆盖sender。单击btnTest 时,其直接处理程序中的代码将运行。当点击btnHp1 时,其直接处理程序只是调用充当btnTest 处理程序的方法,但会覆盖sender 使其看起来像是源自btnHp1 的事件。

这有效地为您提供了 2 个按钮,它们使用相同的代码块执行相同的操作。该代码能够根据它们的Name 属性区分这两个按钮。

如果这不是您真正想要的,请告诉我,我会尽力帮助您。

【讨论】:

  • 或者只是将代码从btnTest_Click移动到btnHp1_Click
  • 我猜他想要 2 个不同的按钮来做同样的事情,因为他在弹出窗口中显示了按钮的 Name 属性。
  • 是的,虽然也有可能他太新了,他只是从一个按钮中看到任何东西来了解事件处理程序的功能。
  • 事实上,我有 24 个按钮要跟踪,我只想将按钮值传递给一个涉及许多功能的唯一处理程序。为了简短起见,我在这里简化了代码。
  • 我猜他想要两个不同的按钮来做同样的事情,在这种情况下,你只需将两个按钮都连接到btnHp1_Click
【解决方案2】:

这是您想要实现的目标的一个简单示例。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace StackOverFlow
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            btnHp1.Click += new EventHandler(btnTest_Click);
        }       

        void btnTest_Click(object sender, EventArgs e)
        {
            Button button = sender as Button;

            if (button != null)
            {
                MessageBox.Show(button.Name);
            }
        }
    }
}

或者您可以在设计器的InitializeComponent() 中手动添加处理程序。类似:

private void InitializeComponent()
        {
            // Generated code
            btnHp1.Click += new EventHandler(btnTest_Click);
            // Generated code
        }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-30
    • 2011-03-28
    • 1970-01-01
    • 2019-04-01
    • 2017-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多