我在c#中以windows形式实现搜索功能。我已在表单上将KeyPreview
设置为true,并为KeyDown
添加了事件处理程序,因此我可以捕获ctrl+f
,esc
和enter
等内容。< / p>
我正好抓住这些钥匙,我可以让我的文本框出现,但我无法输入框。所有密钥都将转到PortsTraceForm_KeyDown(...)
,但它们永远不会进入文本框。根据关于KeyPreview
的msdn页面,将e.Handled设置为false会导致事件传递到焦点视图(文本框),但这不会发生。我没有为文本框注册KeyDown
事件,因此它应该使用默认行为。我错过了什么吗?
KeyDown事件:
private void PortsTraceForm_KeyDown(object sender, KeyEventArgs e)
{
e.SuppressKeyPress = true;
e.Handled = false;
if (e.KeyData == (Keys.F | Keys.Control)) // ctrl+f
{
e.Handled = true;
ShowSearchBar();
}
else if (e.KeyCode == Keys.Escape) // esc
{
e.Handled = true;
HideSearchBar();
}
else if (e.KeyCode == Keys.Enter) // enter
{
if (searchPanel.Visible)
{
e.Handled = true;
if (searchShouldClear)
SearchStart();
else
SearchNext();
}
}
}
显示搜索栏:
private void ShowSearchBar()
{
FindBox.Visible = true;
FindBox.Focus(); // focus on text box
}
隐藏搜索栏:
private void HideSearchBar()
{
this.Focus(); // focus on form
FindBox.Visible = false;
}
答案 0 :(得分:1)
即使您正在呼叫Focus()
,您的TextBox也可能没有焦点。来自the documentation:
Focus是一种低级方法,主要用于自定义控件作者。相反,应用程序员应该对子控件使用Select方法或ActiveControl属性,或者对表单使用Activate方法。
你可以检查Focus()
的返回值是否成功,但过去我运气不好,使用该方法将焦点设置为任意控件。相反,请尝试使用文档建议的方法,即调用Select()
。
编辑:
没关系(尽管它仍然是有效的建议),我想我看到了你的问题:
e.SuppressKeyPress = true
你为什么要这样做?同样,来自the docs:
[SuppressKeyPress]获取或设置一个值,该值指示是否应将键事件传递给基础控件
因此,您故意阻止TextBox获取关键事件。如果您想要通过该活动,则不应将该属性设置为false
。
答案 1 :(得分:0)
尝试这个覆盖方法的例子。
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
// your code here
// this is message example
MessageBox.Show(keyData.ToString());
return base.ProcessCmdKey(ref msg, keyData);
}
问候。