質問

基本を拡張したい 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 メソッドをオーバーライドする必要があります。それで私はそれをしました、しかしそれは与えます InvalidOperationExceptioninnerException のメッセージ NullReferenceException.

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

役に立ちましたか?

解決

なぜ継承しないのか ユーザーコントロール Text や Image などのプロパティを持つカスタム コントロールを定義するには?

他のヒント

いずれにせよ、汎用コレクションのみを使用する方がよいでしょう。Bieng Control Collection は、実際には特別なことを何も行いません。

puclic class MyCollection : Collection<Control>

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
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top