Sandro Bizioli


Chi sogna di giorno conosce molte cose che sfuggono a chi sogna soltanto di notte. (E.A.Poe)
Mappa

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

Categoria: VB.Net
mercoledì, 27 ago 2008 Ore. 17.20
Statistiche
  • Views Home Page: 111.524
  • Views Posts: 568.170
  • Views Gallerie: 117.370
  • n° Posts: 227
  • n° Commenti: 222
Copyright © 2002-2007 - Blogs 2.0
dotNetHell.it | Home Page Blogs
ASP.NET 2.0 Windows 2003