如何确定表单上的哪个控件有焦点?

时间:2009-02-04 17:07:18

标签: c# .net winforms controls focus

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

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

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

4 个答案:

答案 0 :(得分:5)

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

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

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

答案 1 :(得分:5)

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

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

如果你这样做,那么按钮的外观就会改变,给用户一个视觉提示,告诉他们哪个按钮是默认的。

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

您是否问过自己,如果默认按钮不是其中一个文本框,应该怎么做?

答案 2 :(得分:4)

您是否尝试过Form.ActiveControl

答案 3 :(得分:0)

您可以使用此代码作为捕获表单按键事件的起点。 ActiveControl是一个关注焦点的人。在此示例中,当您在窗体上的不同TextBox中时,可以灵活地在“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