0

我想扩展ControlCollectionVB.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

我在谷歌上搜索,有人说CreateControlsInstance需要重写该方法。所以我这样做了,但随后它给出InvalidOperationException了一条innerException消息NullReferenceException

我该如何实施?

4

3 回答 3

3

为什么不从UserControl继承来定义具有 Text 和 Image 等属性的自定义控件?

于 2008-09-22T08:59:08.107 回答
0

无论如何,您最好只使用通用集合。Bieng Control Collection 并没有真正为它做任何特别的事情。

puclic class MyCollection : Collection<Control>
于 2008-09-22T09:05:31.210 回答
0

如果您从 Control.ControlCollection 继承,那么您需要在您的类中提供一个 New 方法。您的 New 方法必须调用 ControlCollection 的构造函数 (MyBase.New) 并将其传递给有效的父控件。

如果您没有正确执行此操作,则会在 Add 方法中引发 NullReferenceException。

这也可能导致您的 CreateControlsInstance 方法中出现 InvalidOperationException

以下代码错误地调用构造函数,导致 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
于 2008-09-22T11:31:48.473 回答