2009-03-18 10 views

Répondre

27

Form.ActiveControl peut être ce que vous voulez.

+0

veux juste souligner que si vous avez changé quelque chose (définir une propriété .Text par exemple), il retournera le contrôle que la dernière utilisation. y compris le réglage des choses comme le .Text pas toujours le contrôle qui a le focus – PsychoData

-2

Quelque chose le long de ces lignes:

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 

Je pense que ce code est venu de windowsclient.net, mais il a été un moment, alors ...

+2

S'il vous plaît laissez-moi downvote la réponse jusqu'à ce que vous l'ayez terminé. L'appel de 'GetFocus()' se bloque dans nulle part et la réponse sous cette forme ne fonctionnera tout simplement pas. – miroxlav

3

En C# Je fais ceci:

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

txtModelPN est une zone de texte que je suis en train de mettre en surbrillance sur enter et mouseEnter et surlignage sur Leave, MouseLeave. Sauf s'il s'agit du contrôle actuel, je ne remets pas l'arrière-plan au blanc.

L'équivalent VB serait comme ce

IF txtModelPN <> Me.ActiveControl Then 
    txtModelPN.BackColor = Color.White 
End If 
7

Notez qu'un seul appel à ActiveControl ne suffit pas quand les hiérarchies sont utilisées. Imaginez:

Form 
    TableLayoutPanel 
     FlowLayoutPanel 
      TextBox (focused) 

(formInstance).ActiveControl retournera référence à TableLayoutPanel, pas le TextBox

Il faut donc utiliser cette (divulgation complète: adapté de this C# answer)

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 
1

Vous pouvez l'utiliser pour trouver par nom de contrôle .

If DataGridView1.Name = Me.ActiveControl.Name Then 
     TextBox1.Visible = True 
    Else 
     TextBox1.Visible = False 
    End If 
1

Vous pouvez utiliser la propriété ActiveControl du formulaire et utiliser ce contrôle.

me.ActiveControl 

Ou

Form.ActiveControl 
Questions connexes