Расширение ControlCollection в VB.NET - PullRequest
       19

Расширение ControlCollection в VB.NET

0 голосов
/ 22 сентября 2008

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

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

Но когда я запускаю пример, он дает 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 ]

3 голосов
/ 22 сентября 2008

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

0 голосов
/ 22 сентября 2008

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

Если вы сделали это неправильно, исключение NullReferenceException будет выдано в методе Add.

Это также может вызывать исключение 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
0 голосов
/ 22 сентября 2008

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

puclic class MyCollection : Collection<Control>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...