Pergunta

Eu quero estender a ControlCollection básica em VB.NET para que eu possa apenas adicionar imagens e texto para um controle self-made, e depois automaticly convertê-los para PictureBoxes e lables.

Então eu fiz uma classe que herda de ControlCollection, overrided o método add, e acrescentou a funcionalidade.

Mas quando eu executar o exemplo, ele dá um NullReferenceException.

Aqui está o 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

Eu procurei no Google, e alguém disse que o método CreateControlsInstance precisa ser anulado. Então eu fiz isso, mas então ele dá InvalidOperationException com uma mensagem innerException de NullReferenceException.

Como faço para implementar isso?

Foi útil?

Solução

Por que não herdam UserControl para definir um controle personalizado que tem propriedades como texto e imagem?

Outras dicas

Você é provavelmente melhor fora de usar apenas um conjunto genérico de qualquer maneira. Coleção de Controle Bieng doesnt realmente fazer alguma coisa especial para ele.

puclic class MyCollection : Collection<Control>

Se você está herdando de Control.ControlCollection então você precisa fornecer um novo método em sua classe. Seu método de New deve chamar o construtor de ControlCollection (MyBase.New) e passá-lo um controle pai válido.

Se você não tiver feito isso corretamente, o NullReferenceException será lançada no método Add.

Esta também poderia estar causando o InvalidOperationException em seu método CreateControlsInstance

O código a seguir chama o construtor incorretamente fazendo com que o método Add para lançar um 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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top