【问题标题】:Button clicked event not triggering after lost focus event失去焦点事件后未触发按钮单击事件
【发布时间】:2015-03-16 19:47:59
【问题描述】:

我有一个带有一些组合框、取消和保存按钮的 Winforms c# 表单,它们可以正常工作。 我现在需要捕捉用户何时将文本输入到组合框中。 我向组合框添加了一个空的(暂时) lostFocus (或离开)事件,它可以正常触发。但是,如果该事件的原因是取消或保存按钮按下,则不再触发相应的事件。如果在其他时间按下这些按钮仍然可以正常工作。

这两个事件应该按顺序触发还是有更好的方法来捕获已完成的文本输入?

【问题讨论】:

  • 我说,我有 1 万亿美元,每个人都会相信我!不?...然后分享代码亲爱的,展示你拥有的资产!
  • 这应该可以正常工作 - 请提供您的表单代码。
  • 该表单有 700 行代码,我无法将它们全部发布在这里,如果只是发布一些,我可能会错过导致问题的位。有没有办法调试事件进程?
  • 一个简单的解决方法是将离开的调用添加到两个特殊按钮的单击中(确保它只被调用一次)..
  • 如果您只是发布一些代码(取消和保存点击事件会特别有帮助),这对于试图帮助您的人大有帮助。如果那里有 700 行,则需要进行一些提取和重构...

标签: c# winforms


【解决方案1】:

Leave 和/或LoseFocus 事件不会被触发,因为您没有离开组合框,并且当您按下Enter 或Escape 时它不会失去焦点。

因此,最好的方法是在LoseFocus 事件中添加您正在触发的功能,同时在Cancel- 和Accept-Buttons 的Button 点击事件中添加。

添加对离开事件本身的调用:comboBox1.Leave(null, null); 将是最简单的方法。

为了确保该函数只被调用一次,我检查了ButtonClick 事件中的焦点:

private void acceptButton_Click(object sender, EventArgs e)
{
    if (comboBox1.ContainsFocus) comboBox1_Leave(acceptButton, null);
    // do accept stuff here..
}

private void cancelButton_Click(object sender, EventArgs e)
{
    if (comboBox1.ContainsFocus) comboBox1_Leave(cancelButton, null);
    // do cancel stuff here..
}

private void comboBox1_Leave(object sender, EventArgs e)
{
    // do leave stuff here..
    Console.WriteLine(sender);
}

我还传递了Button,因此您可以检查sender 以了解Leave 是如何被触发的..

【讨论】:

    【解决方案2】:

    我在这里回答我自己的问题,因为我觉得它可能对其他新手有用。

    我在空的 lostFocus 事件中设置的断点是阻止按钮单击事件发生。当我删除断点时,问题就消失了。

    但是,当我向 lostFocus 事件添加代码时,表单重绘有时会移动按钮并阻止其事件触发。为了解决这个问题,我调整了 TaWs 非常有用的答案,并从 lostFocus 事件中触发了按钮事件。

    private void comboBox1_LostFocus(object sender, EventArgs e)
    {
        bool saving = btnSave.ContainsFocus;
    
        // form redraw stuff here..
        if (saving)
             btnSave_Click(btnSave, null);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-11
      • 2016-07-01
      • 2010-10-21
      相关资源
      最近更新 更多