Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    Ottenere Parent da controllo personalizzato [C#/VB.NET]

    Salve gente,
    sto creando un controllo personalizzato ereditato dal controllo panel aggiungendo delle proprietà personalizzate. Mi trovo pero ad affrontare il seguente problema: devo accedere al controllo (che sia un Form, un GroupBox, ecc..) per ottenere alcune sue proprietà quali larghezza, posizione, ecc...
    Ho provato con il classico
    codice:
    Me.Parent
    che però non restituisce niente. Infatti sia in DesignMode che all'esecuzione del programma ricevo un errore: Riferimento a un oggetto non impostato su un'istanza di oggetto.
    Attualmente ho tamponato il problema con una proprietà per specificare il controllo che lo contiene, ma ovviamente è solo momentaneo.

    Come posso ottenere il controllo 'contenitore'?

    Grazie in anticipo

  2. #2
    Utente di HTML.it
    Registrato dal
    Mar 2014
    residenza
    Vicenza
    Messaggi
    318
    Secondo me se parli di contenitore sbagli, visto che in realtà stai parlando di ereditarietà e non di oggetti uno dentro l'altro.
    Ma non ho capito una cosa: cosa intendi per "accedere al controllo" ??
    Accedere da dove ??
    Dall'interno del controllo stesso oppure da un form che contiene il tuo controllo ??

    Sergio

  3. #3
    Grazie SirJo per la tempestiva risposta.

    Secondo me se parli di contenitore sbagli, visto che in realtà stai parlando di ereditarietà e non di oggetti uno dentro l'altro.
    Mi sono spiegato male. Lo so che il controllo è ereditato. Io intendo quando lo vado ad usare in un Form.
    La situazione è questa:
    Creo il mio controllo personalizzato, supponiamo 'mio_pulsante' che eredita dalla classe Button.
    Adesso voglio usare il mio pulsante personalizzato in un form. Creo un nuovo form e aggiungo un panel chiamato 'Panel1'.
    Vado nella casella degli strumenti e trascino il mio pulsante dentro il panel 'Panel1'.
    'Panel1' in questo caso è il 'Parent' a cui facevo riferimento nella mia domanda.

    Come faccio ad ottenere quell'oggetto panel nella classe in cui ho definito il mio controllo personalizzato?

  4. #4
    Utente di HTML.it
    Registrato dal
    Mar 2014
    residenza
    Vicenza
    Messaggi
    318
    Ok, spero di aver capito tutto.

    Ho creato un nuovo progetto, ho creato la classe miopulsante.vb con questo codice:
    codice:
    Public Class miopulsante
        Inherits Button
    
        Public Function GetParent() As String
            Return Me.Parent.Name
        End Function
    
    End Class
    Ho creato un form, dove ho messo un panel chiamato Panel1, dentro al panel ho messo un "miopulsante", e a parte ho messo un bottone chiamato Button1.
    L'evento click di button1 l'ho fatto così:
    codice:
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    
            MessageBox.Show(Miopulsante1.GetParent)
    
        End Sub
    Mando in esecuzione, clicco su Button1 e mi dice giustamente "Panel1"

    Era questo che chiedevi ???

    Sergio

  5. #5
    Grazie ancora SirJo,
    si in linea di massima è così. Ho provato come hai detto tu e funziona alla perfezione. Il problema sorge quando creo un'altra classe che eredita da 'miopulsante'.

    codice:
    Public Class miopulsante2
        Inherits miopulsante
    
    
        Public ReadOnly Property larghezzaParent As Integer
            Get
                Return Me.Parent.Width
            End Get
        End Property
    
    
    End Class


    Se provo ad aggiungere il 'miopulsante2' al form mi dà l'errore che avevo menzionato prima.

    Grazie ancora per la pazienza e l'aiuto.



  6. #6
    Utente di HTML.it
    Registrato dal
    Mar 2014
    residenza
    Vicenza
    Messaggi
    318
    Questo è il file miopulsante.vb:
    codice:
    Public Class miopulsante
        Inherits Button
    
        Public ReadOnly Property larghezzaParent As Integer
            Get
                Return Me.Parent.Width
            End Get
        End Property
    
    End Class
    Mentre questo miopulsante2.vb:
    codice:
    Public Class miopulsante2
        Inherits miopulsante
    
    End Class
    Quando posizioni un oggetto miopulsante2 sul form vedrai che puoi accedere anche a larghezzaParent visto che è dichiarato public sulla classe base e funziona perfettamente

    Sergio

  7. #7
    Si ci avevo pensato questa mattina alla tua soluzione ma non volevo aggiungere una proprietà in più.
    Ho trovato la soluzione ottimale. Si deve usare
    codice:
    MyBase.Parent
    invece di
    codice:
    Me.Parent
    Quindi il codice diventa:
    codice:
    Public Class miopulsante    Inherits Button
    
    End Class
    Per il secondo controllo:

    codice:
    Public Class miopulsante2    Inherits miopulsante
    
    
        Protected Overrides Sub OnClick(e As EventArgs)
            MyBase.OnClick(e)
            MsgBox(MyBase.Parent.Name)
        End Sub
    
    
    End Class
    Grazie mille SirJo
    Ultima modifica di Omar123; 17-08-2014 a 13:09

Tag per questa discussione

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.