Extension de ControlCollection dans VB.NET
-
02-07-2019 - |
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?
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