2011-09-12 31 views
1

我在c#中的窗体窗体中实现了一个搜索功能。我在表单上设置了KeyPreview为true,并为KeyDown添加了一个事件处理程序,因此我可以捕获诸如ctrl+f,escenter之类的事件。当在窗体上使用TextPreview时,TextBox没有收到键值

我抓住这些键就好,我可以让我的文本框出现,但我无法输入到框中。所有的钥匙都会去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

首先我会在TextBox的Lost ficus事件上订阅,然后检查FindBox.Focus();以某种方式调用TextBox的方式失去焦点.. – Tigran

+0

这是一个很好的建议,除了光标仍然可见和闪烁,所以我相当积极,它不失去焦点。 – mtmurdock

回答

1

你的文本框可能不具有焦点,即使你在呼唤Focus()。来自the documentation:

焦点是主要用于自定义控件作者的低级方法。相反,应用程序员应该为子控件使用Select方法或ActiveControl属性,或者为窗体使用Activate方法。

您可以检查返回值Focus()是否成功,但过去我没有使用该方法将焦点设置为任意控件。请尝试使用文档建议的方法,即拨打Select()

编辑:

没关系(尽管它仍然是有效的建议),我想我看到你的问题:

e.SuppressKeyPress = true 

你为什么要这么做?再次,从the docs:

[SuppressKeyPress]获取或设置指示是否将该键事件应该被传递到底层控制

所以特意要防止文本框从获取键事件的值。如果你想通过你的事件不应该将该属性设置为false

+0

我很欣赏答案,但它与我的问题无关。即使当我点击文本字段并开始输入时,它也不起作用。这些事件仍然没有进入文本字段。 – mtmurdock

+0

@mtmurdock:我看到你的问题,添加了一个编辑。 –

+0

哦,哎呀...我试图抑制'叮叮当当'的噪音,并且必须复制错误的代码行。你碰巧知道如何抑制丁? – mtmurdock

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); 
    } 

问候。

相关问题