VB.NET での ControlCollection の拡張
-
02-07-2019 - |
質問
基本を拡張したい 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
.
これを実装するにはどうすればよいですか?
解決
なぜ継承しないのか ユーザーコントロール 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