【问题标题】:Buttons and Events in c#c#中的按钮和事件
【发布时间】:2011-01-24 03:27:46
【问题描述】:

你怎么会这样做 button1.Enabled = false;如果您仍然单击它,之前添加的事件处理程序单击仍会触发它?

我想禁用按钮,这样当按下它时不会触发 .Click 事件而不执行 button1.Click -= new EventHandler(panel_Click);

我该怎么办?

【问题讨论】:

  • 这是 ASP.NET、WPF 还是 WinForms?
  • 这是winforms还是webforms?
  • 我认为如果click 事件的按钮被禁用,对于大多数平台上大多数语言的大多数 UI 控件来说,它永远不会被触发。
  • @Jeff M,是的,那是我的错误。因为我在编码过程中将 PictureBox 数组更改为 Button 数组并且点击事件没有更新,谢谢...现在一切正常
  • 哎呀,我写例子的速度很慢。但现在看来问题已经解决了。 :)

标签: c# .net winforms


【解决方案1】:

我从未测试过该事件是否仍会触发。似乎违反直觉。您可以通过在回调方法中放置以下语句来简单地克服这个问题

if (!button1.Enabled)
{
   return;
}

这将中断您的方法,因此任何后续代码都不会执行。

编辑:

在 ASP.Net 和 Win Forms 中执行测试后,一定是您有一行恶意代码调用此方法。容易犯错误,有时很难追查。但是,利用调用堆栈窗口可以做到这一点。

只需在回调方法中放置一个断点。当它到达时,点击菜单 Debug -> Windows -> Call Stack

这将显示从哪里调用该方法。双击窗口中的任何给定项目,它会将您重定向到发生调用的方法。您将使用它找到您的错误。

【讨论】:

  • 如果这是 ASP.NET,那么这将不是一个好方法,因为您将浪费时间执行不必要的回发
  • @Matthew Cox,它不是 Asp,它的 Windows 窗体应用程序
  • 附加说明,我刚刚用 ASP.Net 做了一个示例测试。回调不会在 Enabled = "false" 的表单中的按钮上启动
  • @Alon B 代码示例也适用于 Win Forms。但是,从技术上讲,这仍然意味着在不必要的回调上浪费时间。让我启动一个 win forms 应用程序,看看我能重现什么
  • @Matthew Cox,好像那个button1有一个点击分配给它,那么即使button1.enable = false,如果我点击这个按钮它仍然会触发它。是否可以在不删除点击事件处理程序的情况下克服它?
【解决方案2】:

它不应触发Click 事件。

public MyForm()
{
    InitializeComponent();

    var button = new Button {Enabled = false};

    button.Click += ButtonClick;

    Controls.Add(button);
}

void ButtonClick(object sender, EventArgs e)
{
    MessageBox.Show(@"Clicked!");
}

以上将在您的表单中添加一个禁用的按钮,并且 MessageBox 不会显示。但如果你将 Enabled 设置为 true,它会。

【讨论】:

  • +1 - 我刚刚写完一个类似的例子,但你打败了我。 :)
  • 是的,我也写了一个。如果您看到我在下面发布的评论。 =D 这实际上只是表明他的应用程序中有错误。可能是流氓代码行。我建议他应该使用 Visual Studios 中的调用堆栈窗口来跟踪调用他的方法的位置......我敢打赌,如果它真的被禁用,它不会来自他的按钮。
  • @Matthew - 是的,我记得作为新手也犯过类似的错误。
【解决方案3】:

我注意到您正试图从 按钮的单击事件中删除 panel_Click 处理程序。您确定正在触发按钮的单击事件吗?添加按钮的面板是否有点击处理程序?即使按钮被禁用,它后面的任何其他具有适用事件的控件仍会触发。

这是一个小演示:

public class TestForm : Form
{
    public TestForm()
    {
        this.Text = "Test Form";

        var panel = new FlowLayoutPanel
        {
            FlowDirection = FlowDirection.TopDown,
            BorderStyle = BorderStyle.FixedSingle,
        };
        var button = new Button
        {
            Text = "Button!",
            Enabled = false,
        };
        var cb = new CheckBox
        {
            Text = "Buton Enabled",
            Checked = false,
        };

        panel.Click += (sender, e) => MessageBox.Show("Panel clicked!");
        button.Click += (sender, e) => MessageBox.Show("Button clicked!");
        this.Click += (sender, e) => MessageBox.Show("Form clicked!");
        cb.CheckedChanged += (sender, e) => button.Enabled = cb.Checked;

        panel.Controls.Add(button);
        panel.Controls.Add(cb);
        this.Controls.Add(panel);
    }
}

【讨论】:

  • M,我的代码有误。当您禁用按钮时,它不应该触发按钮点击,但在我的代码中其他东西触发了它。所以现在一切都解决了。谢谢你的帮助:)
  • @Alon:啊,所以您将按钮的单击处理程序添加到面板的单击事件中对吗?那将是一个不同的情况。 ;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-13
  • 2018-10-27
  • 1970-01-01
  • 2017-08-25
相关资源
最近更新 更多