键预览和接受按钮

时间:2009-04-13 15:54:42

标签: events acceptbutton

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

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

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

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

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

有什么建议吗?

感谢。

2 个答案:

答案 0 :(得分: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);
    }

答案 1 :(得分:0)

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

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

感谢。