2008-09-22 5 views
0

Я хочу расширить базовый ControlCollection в VB.NET, чтобы я мог просто добавлять изображения и текст в самодельный элемент управления, а затем автоматически конвертировать их в графические ящики и таблицы.Расширение ControlCollection в VB.NET

Таким образом, я создал класс, который наследует ControlCollection, переопределяет метод добавления и добавляет функциональность.

Но когда я запускаю пример, он дает NullReferenceException.

Вот код:

 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 

Я искал в Google, и кто-то сказал, что метод CreateControlsInstance должен быть переопределен. Поэтому я сделал это, но затем он дал InvalidOperationException с сообщением innerException от NullReferenceException.

Как это реализовать?

ответ

3

Почему бы не наследовать от UserControl, чтобы определить настраиваемый элемент управления, который обладает такими свойствами, как текст и изображение?

0

В любом случае вам, вероятно, лучше использовать только общую коллекцию. Bieng Control Collection не делает для этого ничего особенного.

puclic class MyCollection : Collection<Control> 
0

Если вы наследуете Control.ControlCollection, вам необходимо предоставить новый метод в вашем классе. Ваш новый метод должен вызвать конструктор ControlCollection (MyBase.New) и передать ему действительный родительский элемент управления.

Если вы еще этого не сделали, исключение NullReferenceException будет выбрано в методе добавления.

Это также может быть причиной InvalidOperationException в методе CreateControlsInstance

Следующий код вызывает конструктор неправильно вызывая метод Add, чтобы бросить 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