ParentRoot: Ottenere il contenitore più "esterno" di un controllo
Come tutti sanno un controllo VB.Net, sia esso una TextBox, Label, Button od altro, per essere visualizzato deve essere contenuto in un oggetto (controllo) che ne fa da contenitore. Per accecdere a tale contenitore il nostro controllo espone la proprietà .Parent
A sua volta il controllo .Parent potrà essere contenuto in un altro contenitore e così via.
Come fare a sapere qual'è l'oggetto "Root" che gerarchicamente contiene il nostro controllo?
Ovviamente il più esterno sarà il form stesso, ma per questo disponiamo già della proprietà .FindForm
Ecco un paio di funzioni che possono tornare utili.
''' <summary>
''' Dato un controllo viene recuperato il contenitore più esterno che lo contiene
''' </summary>
''' <param name="ctr">Controllo di riferimento</param>
''' <param name="ParentStop">Optionale. Indica il contenitore "limite" entro il quale effettuare la ricerca</param>
''' <returns>Controllo parent più esterno.</returns>
''' <remarks></remarks>
Private Function ParentRoot(ByVal ctr As Control, Optional ByVal ParentStop As Control = Nothing) As Control
'**********************************************************************
' Func: ParentRoot (Creazione: SB 20080827 Mod: )
' Desc: Dato un controllo viene recuperato il contenitore più esterno che lo contiene
' Par : ctr Controllo da cui partire
' [ParentStop] Opzionale. Controllo "limite" entro il quale effettuare la ricerca
' Ret : Control Controllo Parent gerarchicamente più esterno
' Note:
'**********************************************************************
Do While Not ctr Is Nothing
If ctr.Parent Is ParentStop OrElse TypeOf (ctr.Parent) Is Form Then Exit Do
ctr = ctr.Parent
Loop
Return ctr
End Function
Per chi ama le funzioni ricorsive eccone una che fa al caso nostro.
''' <summary>
''' Dato un controllo viene recuperato il contenitore più esterno che lo contiene
''' </summary>
''' <param name="ctr">Controllo di riferimento</param>
''' <param name="ParentStop">Optionale. Indica il contenitore "limite" entro il quale effettuare la ricerca</param>
''' <returns>Controllo parent più esterno.</returns>
''' <remarks></remarks>
Private Function ParentRoot2(ByVal ctr As Control, Optional ByVal ParentStop As Control = Nothing) As Control
'**********************************************************************
' Func: ParentRoot2 (Creazione: SB 20080827 Mod: )
' Desc: Dato un controllo viene recuperato il contenitore più esterno che lo contiene
' Par : ctr Controllo da cui partire
' [ParentStop] Opzionale. Controllo "limite" entro il quale effettuare la ricerca
' Ret : Control Controllo Parent gerarchicamente più esterno
' Note:
'**********************************************************************
If ctr Is Nothing Then Return ctr
If ctr.Parent Is ParentStop Then Return ctr
If TypeOf (ctr.Parent) Is Form Then Return ctr
ctr = ParentRoot(ctr.Parent, ParentStop)
Return ctr
End Function
mercoledì, 27 ago 2008 Ore. 17.20