gpt4 book ai didi

c# - 如何防止控件在模式窗体打开时捕获 KeyDown 事件?

转载 作者:太空宇宙 更新时间:2023-11-03 15:30:13 25 4
gpt4 key购买 nike

我有一个带有 CancelButton 和 AcceptButton 的表单(名为 btnCancel 和 btnOK)。我有一些组合框作为输入字段。

ComboBoxes 阻止我的 AcceptButton 和 CancelButton 接收 Escape 和 Enter 键,所以我将这段代码添加到所有字段的 KeyDown 事件中:

if (e.KeyData == Keys.Escape)
{
ComboBox field = (ComboBox)sender;
if ((field.DropDownStyle == ComboBoxStyle.Simple) || (!field.DroppedDown))
{
e.SuppressKeyPress = true;
btnCancel.PerformClick();
}
}
else if (e.KeyData == Keys.Enter)
{
ComboBox field = (ComboBox)sender;
if ((field.DropDownStyle == ComboBoxStyle.Simple) || (!field.DroppedDown))
{
e.SuppressKeyPress = true;
btnOK.PerformClick();
}
}

这是OK按钮的Clicked事件中的代码:

if (!changesAreSaved)
{
SaveChangesToNode();
}

List<int> invalidIndices = ValidateAndRefineNodes(true);

if (invalidIndices.Count == 0)
{
this.DialogResult = DialogResult.OK;
this.Close();
}
else
{
MessageBox.Show(this, "Enter correct values for all fields before you press OK.", "Cannot Save Information",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}

一切正常,但是当 ComboBox 具有焦点并且我按下键盘上的 Enter 键时,btnOK_Clicked 再次调用 Fields_KeyDown 当它显示其 MessageBox(在 if 的 else 部分)时。就在 MessageBox.Show(...) 被调用之后,KeyDown 事件被无缘无故地第二次调用。

这是第一次调用的调用堆栈:

This is Call Stack for first call

这是第二个:

This is Call Stack for second call

第二次调用根本不应该发生。在第二个调用堆栈中,第一个 btnOK_Click(第三行)再次调用 Fields_KeyDown(第二行)来自 MessageBox.Show(...)。这怎么可能?我很困惑...

第二次调用的调用堆栈,外部代码可见:

Call Stack with External Code visible

最佳答案

您无法正确处理 KeyDown 事件中的 Escape 和 Enter 键,因为它们是在键盘预处理阶段处理的 - Control.IsInputKeyControl.ProcessDialogKey .通常控件会为您执行此操作,但当 DropDownStyleSimple 时,ComboBox 实现中似乎存在错误。

要获得所需的行为,请像这样创建并使用您自己的 ComboBox 子类

public class MyComboBox : ComboBox
{
protected override bool IsInputKey(Keys keyData)
{
if (DropDownStyle == ComboBoxStyle.Simple)
{
switch (keyData & (Keys.KeyCode | Keys.Alt))
{
case Keys.Return:
case Keys.Escape:
return false;
}
}
return base.IsInputKey(keyData);
}
}

附言当然不要忘记删除您的 KeyDown 事件处理程序。

关于c# - 如何防止控件在模式窗体打开时捕获 KeyDown 事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34018528/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com