【问题标题】:How to determine which control on form has focus?如何确定表单上的哪个控件具有焦点?
【发布时间】:2009-02-04 17:07:18
【问题描述】:

我在这里的其他地方读到过,要在文本框中捕获“Enter”键击并像按下按钮一样使用它,我应该将表单的 KeyPreview 属性设置为 true 并检查 KeyDown 的值。

我希望能够在多个 TextBox 控件上使用此功能,每个控件都与不同的 Button 相关联。

我的问题是如何知道是哪个控件导致了 KeyPress 事件? 发件人被列为表单本身。

G

【问题讨论】:

    标签: c# .net winforms controls focus


    【解决方案1】:

    每个表单都有一个“接受”按钮和“取消”按钮的属性,当用户分别按下回车键和退出键时,这些按钮会被“点击”。

    您可以在每个控件获得焦点时更改默认按钮(您可以为每个按钮设置一个焦点事件处理程序,并与一组文本框共享)

    如果您这样做,那么按钮的外观会发生变化,从而为用户提供视觉提示,告诉他们哪个按钮是默认按钮。

    或者,如果您不想这样做,您可以使用“ActiveControl”属性,并测试它属于哪一组文本框。

    你有没有问过自己,如果默认按钮不是这些文本框之一,它应该是什么?

    【讨论】:

    • 感谢 BW,这是有用的信息。我想在这种情况下我会选择自己的答案,因为我只对单个文本框中的“Enter”按键感兴趣,并且只有当它具有焦点时才感兴趣。谢谢你!
    • G- 的评论提示我哪里出错了,感谢您提供更多详细信息。我的应用程序大多只是这个对话框,所以它甚至没有按钮,除非你退出,否则它永远不会关闭。
    【解决方案2】:

    我找到了一个似乎有效的解决方案。

        private void DeviceForm_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyValue == 13 && tstxtDeviceFilter.Focused)
            {
                filterByDeviceSN();
            }
        }
    

    我不禁认为一定有更好的方法!

    --编辑--编辑--编辑--编辑--编辑--

    好吧,在查看了以下建议后(谢谢),我在这种情况下找到了一种“更好”的方法。

        this.tstxtDeviceFilter.KeyDown += new System.Windows.Forms.KeyEventHandler(this.tstxtDeviceFilter_KeyDown);
    
        private void tstxtDeviceFilter_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyValue == 13)
            {
                filterByDeviceSN();
            }
        }
    

    显然,通过在文本框本身而不是表单上捕获事件,我不需要担心焦点。我又一次因为这么久没有想到这一点而感到愚蠢!

    【讨论】:

      【解决方案3】:

      你试过Form.ActiveControl吗?

      【讨论】:

      • 我查看了这个,但我希望在其中找到焦点“this.ActiveControl.Name”的控件名称是一个空字符串。不过,我可能在做一些非常明显的错误!
      • 我猜它并不总是有效,ActiveControl.Focused 为 False,本例为 splitContainer。
      【解决方案4】:

      您可以使用此代码作为起点来捕获表单的按键事件。 ActiveControl 是一个具有焦点的控件。在此示例中,当您在表单上的不同文本框中时,可以灵活地在“Enter”上添加其他操作。它是 VB.NET,但您应该能够轻松转换为 C#。

      Private Sub MyForm_KeyDown(ByVal sender As Object, _
          ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
      
          If e.KeyCode = Keys.Enter Then
              If Me.ActiveControl.Name = Me.TextBox1.Name Then
                  ' This is the TextBox we want to be active to run filterByDeviceSN()
                  filterByDeviceSN()
              ElseIf Me.ActiveControl.Name = Me.TextBox2.Name Then
                  foo()
              End If
          End If
      End Sub
      

      【讨论】:

      • ActiveControl.Name 返回一个空字符串。 ActiveControl.Text 通过返回与当前文本框中相同的字符串来按预期运行。 “this.ActiveControl.Equals(tstxtDeviceFilter)”返回 false。想我现在会用我自己的答案。除非有人知道如何取名?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-03
      • 2012-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-06
      • 2015-10-23
      相关资源
      最近更新 更多