1

使用 winforms,我将 KeyPreview 属性设置为 true,并且在基本表单中也为正确的键事件提供了事件句柄。

在从它继承的表单中,我根据应用程序的要求设置了 AcceptButton 属性。

在某些情况下,我希望 Enter 键的功能与 AcceptButton 的功能不同。

我希望在我的基本表单中捕获输入键并检查我不希望AcceptButton 事件触发的特殊情况。

不过,AcceptButton 点击​​似乎是在我的 basef 表单中的任何关键事件之前触发的。我可以将功能写入可能的接受按钮的点击事件中,但在我看来,这将是一个 hack。

有什么建议么?

谢谢。

4

2 回答 2

2

处理此问题的另一种方法是覆盖表单的 ProcessDialogKey() 方法,您可以在该方法中取消接受和/或取消按钮。例如,我有一个带有过滤器编辑器的应用程序,它根据用户输入过滤网格。当过滤器编辑器控件具有应用过滤器的焦点时,我希望用户能够点击返回键。问题是接受按钮代码运行并关闭表单。下面的代码解决了这个问题。

    protected override bool ProcessDialogKey(Keys keyData)
    {
        // Suppress the accept button when the filter editor has the focus.
        // This doesn't work in the KeyDown or KeyPress events.
        if (((keyData & Keys.Return) == Keys.Return) && (filterEditor.ContainsFocus))
            return false;

        return base.ProcessDialogKey(keyData);
    }

您可以通过将以下代码放入基本对话框表单中来进一步实现这一点。然后,您可以根据需要取消子类中控件的接受按钮。

    private readonly List<Control> _disableAcceptButtonList = new List<Control>();

    protected override bool ProcessDialogKey(Keys keyData)
    {
        if (((keyData & Keys.Return) == Keys.Return) && (_disableAcceptButtonList.Count > 0))
        {
            foreach (Control control in _disableAcceptButtonList)
                if (control.ContainsFocus)
                    return false;
        }

        return base.ProcessDialogKey(keyData);
    }

    protected virtual void DisableAcceptButtonForControl(Control control)
    {
        if (!_disableAcceptButtonList.Contains(control))
            _disableAcceptButtonList.Add(control);
    }
于 2009-08-06T19:56:27.210 回答
0

作为我们的解决方法,我们捕获了我们想要覆盖接受按钮功能的控件的进入和离开事件。在 enter 事件中,我们将当前的接受按钮保存在一个私有变量中,并将接受按钮设置为 null。休假时,我们会将接受按钮重新分配给我们持有的私有变量。

KeyPreview 事件可能已经完成了与上述类似的事情。如果有人有更优雅的解决方案,我仍然很想知道。

谢谢。

于 2009-04-21T13:24:58.887 回答