【问题标题】:How can I override the default button on a form when focus is in a TextBox当焦点在文本框中时,如何覆盖表单上的默认按钮
【发布时间】:2012-04-10 10:37:29
【问题描述】:

我有一个带有典型 OK 和 Cancel 按钮的 winform 表单。

确定按钮被设置为默认按钮。当用户按下 ENTER 键时,表单关闭。

表单还有一个文本框,旁边有一个搜索按钮。文本框允许用户输入搜索文本,搜索按钮启动搜索功能。

我希望用户能够在文本框具有输入焦点并激活搜索功能时按 ENTER 键。

问题是表单在文本框的处理程序获取它之前抓取了 ENTER 键事件。

编辑:我尝试使用以下事件处理程序,但它们从未被击中,并且当按下 Enter 键时表单关闭:

    private void txtFilter_KeyUp(object sender, KeyEventArgs e)
    {
        if (e.KeyCode == Keys.Enter)
        {
            Search();

            e.Handled = true;           
        }
    }

    private void txtFilter_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.KeyCode == Keys.Enter)
        {
            Search();

            e.Handled = true;
        }
    }

我还尝试在表单上启用 KeyPreview 属性并为表单实现 KeyDown 事件处理程序,但 Enter 键似乎永远不会导致任何这些被击中。

最好的方法是什么?

【问题讨论】:

  • 请提供更多细节 - 表单和文本框的事件捕获是如何实现的?

标签: c# .net winforms user-interface user-input


【解决方案1】:

尝试处理 TextBox 的 EnterLeave 事件以清除表单的 AcceptButton 属性:

private void txtFilter_Enter(object sender, EventArgs e) {
  this.AcceptButton = null;
}

private void txtFilter_Leave(object sender, EventArgs e) {
  this.AcceptButton = closeButton;
}

然后您可以根据需要处理您的KeyUp 事件:

private void txtFilter_KeyUp(object sender, KeyEventArgs e)
{
  if (e.KeyCode == Keys.Enter)
  {
    Search();         
  }
}

【讨论】:

  • 我在您发布之前就考虑过尝试一下,效果很好!谢谢!!
【解决方案2】:

将 KeyDown 事件处理程序添加到文本框,然后将其添加到其中

        if (e.KeyCode == Keys.Enter)
        {
            btnSearch.PerformClick();
        }

【讨论】:

  • 我已经尝试对 KeyDown 和 KeyUp 事件处理程序执行此操作,但没有一个处理程序被命中,并且表单关闭。
猜你喜欢
  • 2012-02-05
  • 1970-01-01
  • 1970-01-01
  • 2011-05-28
  • 1970-01-01
  • 1970-01-01
  • 2011-09-06
  • 2021-10-06
  • 1970-01-01
相关资源
最近更新 更多