Frage

Ich mag den Grund ControlCollection in VB.NET erweitern, so kann ich nur Bilder hinzufügen und Text in eine selbstgemachten Kontrolle, und sie dann zu PictureBox und Lables automatisch konvertieren.

So habe ich eine Klasse, die von Control erbt, overrided die Add-Methode, und hinzugefügt, um die Funktionalität.

Aber wenn ich das Beispiel laufen, gibt es einen NullReferenceException.

Hier ist der Code:

        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

Ich suchte auf Google, und jemand sagte, dass die CreateControlsInstance Methode außer Kraft gesetzt werden muss. Also tat ich das, aber dann gibt es InvalidOperationException mit einer innerException Nachricht von NullReferenceException.

Wie kann ich das umsetzen?

War es hilfreich?

Lösung

Warum erben nicht von Usercontrol definieren eine benutzerdefinierte Steuerelement, das Eigenschaften wie Text und Bild hat?

Andere Tipps

Sie sind wahrscheinlich besser dran sowieso nur eine generische Auflistung verwenden. Bieng Kontrolle Sammlung doesnt wirklich etwas Besonderes tun es.

puclic class MyCollection : Collection<Control>

Wenn Sie erben von Control.ControlCollection dann müssen Sie eine neue Methode in der Klasse liefern. Ihre neue Methode muss Control Konstruktor aufrufe (MyBase.New) und gibt ihnen eine gültige übergeordnete Steuerung.

Wenn Sie dies nicht richtig getan haben, wird die Nullreferenceexception in der Add-Methode geworfen werden.

Dies könnte auch die InvalidOperationException in Ihrem CreateControlsInstance Verfahren verursacht

Der folgende Code ruft der Konstruktor falsch die Add-Methode verursacht eine Nullreferenceexception zu werfen ...

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top