Estensione di ControlCollection in VB.NET
-
02-07-2019 - |
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?
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