Ampliación de ControlCollection en VB.NET
-
02-07-2019 - |
Pregunta
Quiero extender la básica ControlCollection
en VB.NET así que sólo puedo agregar imágenes y texto a un auto de control y, a continuación, automáticamente convertir a pictureboxes y etiquetas.
Así que he hecho una clase que hereda de ControlCollection, overrided el método add, y se añade la funcionalidad.
Pero cuando voy a ejecutar el ejemplo, se da una NullReferenceException
.
Aquí está el código:
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
He buscado en Google, y alguien dijo que el CreateControlsInstance
el método debe ser anulada.Así lo hice, pero luego se da InvalidOperationException
con un innerException
mensaje de NullReferenceException
.
¿Cómo puedo implementar esto?
Solución
¿Por qué no heredan de UserControl para definir un control personalizado que tiene propiedades como el Texto y la Imagen?
Otros consejos
Usted es probablemente mejor usar sólo una colección genérica de todos modos.A la Colección de controles no hace realmente nada especial para él.
puclic class MyCollection : Collection<Control>
Si estás heredando de Control.ControlCollection entonces usted necesita para proporcionar un Nuevo método en la clase.Su Nuevo método debe llamar ControlCollection del constructor (MyBase.Nueva) y pasar una válida control de los padres.
Si usted no ha hecho esto correctamente, el NullReferenceException será lanzado en el método Add.
Esto también podría ser la causa de la excepción InvalidOperationException en su CreateControlsInstance método
El código siguiente llama al constructor de forma incorrecta, causando el método Add para lanzar una excepción 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