0

VB.NETの基本を拡張しControlCollectionて、自作のコントロールに画像とテキストを追加し、それらを自動的にピクチャボックスとラベルに変換できるようにしたいと考えています。

そこで、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

CreateControlsInstanceGoogle で検索したところ、メソッドをオーバーライドする必要があると誰かが言いました。だから私はそれをしましたが、それはInvalidOperationExceptioninnerExceptionメッセージで与えますNullReferenceException

これを実装するにはどうすればよいですか?

4

3 に答える 3

3

UserControlから継承して、Text や Image などのプロパティを持つカスタム コントロールを定義してみませんか?

于 2008-09-22T08:59:08.107 に答える
0

Control.ControlCollection から継承している場合は、クラスに New メソッドを提供する必要があります。New メソッドは、ControlCollection のコンストラクター (MyBase.New) を呼び出し、有効な親コントロールを渡す必要があります。

これが正しく行われていない場合、NullReferenceException が Add メソッドでスローされます。

これにより、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 に答える
0

とにかく、ジェネリックコレクションだけを使用する方がよいでしょう。Bieng Control Collection は、特に何もしません。

puclic class MyCollection : Collection<Control>
于 2008-09-22T09:05:31.210 に答える