Domanda

Voglio estendere il ControlCollection di base in VB.NET in modo da poter semplicemente aggiungere immagini e testo a un controllo fatto da sé, e poi convertirli automaticamente in caselle di immagini e lables.

Così ho creato una classe che eredita da ControlCollection, ho ignorato il metodo add e ho aggiunto la funzionalità.

Ma quando eseguo l'esempio, fornisce un NullReferenceException .

Ecco il codice:

        Shadows Sub add(ByVal text As String)
            Dim LB As New Label
            LB.AutoSize = True
            LB.Text = text
            MyBase.Add(LB) 'Here it gives the exception.
        End Sub

Ho cercato su Google e qualcuno ha detto che il metodo CreateControlsInstance deve essere ignorato. Quindi l'ho fatto, ma poi dà InvalidOperationException con un messaggio innerException di NullReferenceException .

Come posso implementarlo?

È stato utile?

Soluzione

Perché non ereditare da UserControl definire un controllo personalizzato con proprietà come Testo e immagine?

Altri suggerimenti

Probabilmente stai meglio usando solo una raccolta generica comunque. Bieng Control Collection non fa davvero nulla di speciale per questo.

puclic class MyCollection : Collection<Control>

Se stai ereditando da Control.ControlCollection, devi fornire un nuovo metodo nella tua classe. Il tuo nuovo metodo deve chiamare il costruttore di ControlCollection (MyBase.New) e passargli un controllo parent valido.

Se non lo hai fatto correttamente, NullReferenceException verrà generata nel metodo Add.

Ciò potrebbe anche causare InvalidOperationException nel metodo CreateControlsInstance

Il codice seguente chiama il costruttore in modo errato causando il metodo Add per generare una NullReferenceException ...

Public Class MyControlCollection
    Inherits Control.ControlCollection

    Sub New()
        'Bad - you need to pass a valid control instance
        'to the constructor
        MyBase.New(Nothing)
    End Sub

    Public Shadows Sub Add(ByVal text As String)
        Dim LB As New Label()
        LB.AutoSize = True
        LB.Text = text
        'The next line will throw a NullReferenceException
        MyBase.Add(LB)
    End Sub
End Class
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top