2009-03-18 24 views

risposta

27

Form.ActiveControl può essere quello che vuoi.

+0

Voglio solo sottolineare che se è stato cambiato qualcosa (impostare una proprietà .Text per esempio) verrà restituito il controllo che l'ultimo utilizzato. incluso l'impostazione di cose come il .Text non sempre il controllo che ha lo stato attivo – PsychoData

-2

Qualcosa in questo senso:

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 

Penso che questo codice è venuto da windowsclient.net, ma è stato un po 'così ...

+2

Per favore lasciami votare la risposta fino a quando non la completi. La chiamata di 'GetFocus()' non si trova in nessun posto e la risposta in questo modulo semplicemente non funzionerà. – miroxlav

3

In C# faccio questo:

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

txtModelPN è una casella di testo che sto evidenziando su enter e mouseEnter e de-highlighting su Leave, MouseLeave. Tranne se è il controllo corrente, non lo sfondo bianco.

VB equivalente sarebbe come questo

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

Si noti che una singola chiamata a ActiveControl non è sufficiente quando si utilizzano le gerarchie. Immaginate:

Form 
    TableLayoutPanel 
     FlowLayoutPanel 
      TextBox (focused) 

(formInstance).ActiveControl tornerà riferimento alla TableLayoutPanel, non il TextBox

Così utilizzare questo (full disclosure: adattato da 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

È possibile utilizzare questo per trovare per nome di controllo .

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

È possibile utilizzare il propert ActiveControl del modulo e utilizzare tale controllo.

me.ActiveControl 

O

Form.ActiveControl 
Problemi correlati