C# 失去焦点事件后未触发按钮单击事件

C# 失去焦点事件后未触发按钮单击事件,c#,winforms,C#,Winforms,我有一个Winforms c#表单,其中包含一些组合框、取消和保存按钮,这些按钮工作正常。 我现在需要捕获用户何时将文本输入到组合框中。 我向combbox添加了一个空的(暂时)lostFocus(或Leave)事件,它会触发fine。但是,如果该事件的原因是按下“取消”或“保存”按钮,则不再触发相应的事件。如果在其他时间按下这些按钮,仍然可以正常工作 这两个事件是按顺序触发的还是有更好的方法来捕获已完成的文本输入?不会触发离开和/或失去焦点事件,因为您没有离开组合框,而且当您按回车或退出时,它

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


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

不会触发
离开
和/或
失去焦点
事件,因为您没有离开组合框,而且当您按
回车
退出
时,它也不会失去焦点

因此,最好的方法是将您在
LoseFocus
事件中触发的功能添加到
按钮中,也添加到
取消-
接受按钮的
单击事件中

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

为了确保只调用一次函数,我在
按钮中检查谁有焦点单击
事件:

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);
}

我还传入了
按钮
,以便您可以检查
发送者
,查看
离开
是如何触发的。

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

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

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

private void comboBox1_LostFocus(object sender, EventArgs e)
{
    bool saving = btnSave.ContainsFocus;

    // form redraw stuff here..
    if (saving)
         btnSave_Click(btnSave, null);
}

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