Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Events 关键点预览和接受按钮_Events_Acceptbutton - Fatal编程技术网

Events 关键点预览和接受按钮

Events 关键点预览和接受按钮,events,acceptbutton,Events,Acceptbutton,使用winforms,我已经将KeyPreview属性设置为true,并在基本表单中为正确的键事件设置了事件句柄 在从它继承的表单中,我根据应用程序的要求设置AcceptButton属性 在某些情况下,我希望enter键具有与AcceptButton不同的功能 我希望在我的基本表单中捕获回车键,并检查我不希望启动AcceptButton事件的特殊情况 不过,似乎AcceptButton单击是在my basef表单中的任何关键事件之前触发的。我可以将功能写入可能的acceptbuttons的点击事

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

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

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

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

不过,似乎AcceptButton单击是在my basef表单中的任何关键事件之前触发的。我可以将功能写入可能的acceptbuttons的点击事件中,但是,在我看来,这是一个黑客行为

有什么建议吗


谢谢。

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

KeyPreview事件可以做与上述类似的事情。如果有人有更优雅的解决方案,我还是很想知道


谢谢。

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

    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);
    }
private readonly List\u disableAcceptButtonList=new List();
受保护的覆盖布尔ProcessDialogKey(Keys keyData)
{
if(((keyData和Keys.Return)=Keys.Return)和(_disableAcceptButtonList.Count>0))
{
foreach(disableAcceptButtonList中的控件)
if(control.ContainsFocus)
返回false;
}
返回base.ProcessDialogKey(keyData);
}
受保护的虚拟无效DisableAcceptButtonForControl(控制)
{
如果(!\u disableAcceptButtonList.Contains(控件))
_disableAcceptButtonList.Add(控件);
}

可能有助于解决我上述问题的后续问题是“有没有办法抑制acceptbutton单击?好主意。我喜欢在需要时在全局级别应用它,而我的问题只是针对特定控件。