Как узнать, какой элемент управления находится в фокусе .NET Windows Forms? - PullRequest
19 голосов
/ 19 марта 2009

Как узнать, какой элемент управления имеет фокус в Windows Forms ?

Ответы [ 7 ]

31 голосов
/ 19 марта 2009

Form.ActiveControl может быть тем, что вы хотите.

8 голосов
/ 09 марта 2012

Обратите внимание, что при использовании иерархий одного вызова ActiveControl недостаточно. Представьте себе:

Form
    TableLayoutPanel
        FlowLayoutPanel
            TextBox (focused)

(formInstance).ActiveControl вернет ссылку на TableLayoutPanel, а не TextBox

Так что используйте это (полное раскрытие: адаптировано из этого ответа C # )

  Function FindFocussedControl(ByVal ctr As Control) As Control
    Dim container As ContainerControl = TryCast(ctr, ContainerControl)
    Do While (container IsNot Nothing)
      ctr = container.ActiveControl
      container = TryCast(ctr, ContainerControl)
    Loop
    Return ctr
  End Function
3 голосов
/ 08 апреля 2011

В C # я делаю это:

        if (txtModelPN != this.ActiveControl)
            txtModelPN.BackColor = Color.White;

txtModelPN - это текстовое поле, которое я выделяю при вводе и mouseEnter и де-выделение при Leave, MouseLeave За исключением случаев, когда это текущий элемент управления, я не устанавливаю фон обратно белым.

Эквивалент VB будет выглядеть так

IF txtModelPN <> Me.ActiveControl Then
   txtModelPN.BackColor = Color.White
End If
2 голосов
/ 27 августа 2013

Вы можете использовать свойство ActiveControl формы и использовать этот элемент управления.

me.ActiveControl

Или

Form.ActiveControl
1 голос
/ 22 января 2013

Вы можете использовать это, чтобы найти по имени элемента управления.

    If DataGridView1.Name = Me.ActiveControl.Name Then
        TextBox1.Visible = True
    Else
        TextBox1.Visible = False
    End If
0 голосов
/ 09 августа 2018

Я использовал следующее:

Private bFocus = False
Private Sub txtUrl_MouseEnter(sender As Object, e As EventArgs) Handles txtUrl.MouseEnter
    If Me.ActiveControl.Name <> txtUrl.Name Then
        bFocus = True
    End If
End Sub

Private Sub txtUrl_MouseUp(sender As Object, e As MouseEventArgs) Handles txtUrl.MouseUp
    If bFocus Then
        bFocus = False
        txtUrl.SelectAll()
    End If
End Sub

Я установил Переменную только в MouseEnter, чтобы улучшить магию

0 голосов
/ 19 марта 2009

Что-то вроде этого:

Protected Function GetFocusControl() As Control
    Dim focusControl As Control = Nothing

    ' Use this to get the Focused Control: 
    Dim focusHandle As IntPtr = GetFocus()
    If IntPtr.Zero.Equals(focusHandle) Then          
      focusControl = Control.FromHandle(focusHandle)
    End If

    ' Note that it returns NOTHING if there is not a .NET control with focus 
    Return focusControl
End Function

Я думаю, что этот код пришел с windowsclient.net, но уже давно так ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...