Events 关键点预览和接受按钮
使用winforms,我已经将KeyPreview属性设置为true,并在基本表单中为正确的键事件设置了事件句柄 在从它继承的表单中,我根据应用程序的要求设置AcceptButton属性 在某些情况下,我希望enter键具有与AcceptButton不同的功能 我希望在我的基本表单中捕获回车键,并检查我不希望启动AcceptButton事件的特殊情况 不过,似乎AcceptButton单击是在my basef表单中的任何关键事件之前触发的。我可以将功能写入可能的acceptbuttons的点击事件中,但是,在我看来,这是一个黑客行为 有什么建议吗Events 关键点预览和接受按钮,events,acceptbutton,Events,Acceptbutton,使用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单击?好主意。我喜欢在需要时在全局级别应用它,而我的问题只是针对特定控件。