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?

¿Fue útil?

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top