Estendendo ControlCollection em VB.NET
-
02-07-2019 - |
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?
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