Question

Je souhaite étendre le ControlCollection de base dans VB.NET afin de pouvoir ajouter des images et du texte à un contrôle créé par l'utilisateur, puis de les convertir automatiquement en images et étiquettes.

J'ai donc créé une classe qui hérite de ControlCollection, redéfini la méthode add et ajouté la fonctionnalité.

Mais lorsque je lance l'exemple, il donne une NullReferenceException .

Voici le 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

J'ai effectué une recherche sur Google. Quelqu'un a dit que la méthode CreateControlsInstance devait être remplacée. C'est ce que j'ai fait, mais cela donne InvalidOperationException avec un message innerException de NullReferenceException .

Comment puis-je implémenter cela?

Était-ce utile?

La solution

Pourquoi ne pas hériter de UserControl définir un contrôle personnalisé ayant des propriétés telles que Texte et Image?

Autres conseils

Vous feriez probablement mieux d’utiliser de toute façon une collection générique. Bieng Control Collection ne fait pas vraiment quelque chose de spécial pour elle.

puclic class MyCollection : Collection<Control>

Si vous héritez de Control.ControlCollection, vous devez fournir une nouvelle méthode dans votre classe. Votre nouvelle méthode doit appeler le constructeur de ControlCollection (MyBase.New) et lui transmettre un contrôle parent valide.

Si vous ne l'avez pas fait correctement, l'exception NullReferenceException sera levée dans la méthode Add.

Ceci peut également être à l'origine de l'exception InvalidOperationException dans votre méthode CreateControlsInstance

Le code suivant appelle le constructeur de manière incorrecte, ce qui a amené la méthode Add à lancer une exception 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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top