コントロールを動的に作成し、それ自体でイベント ハンドラーを追加するフォームがあります (その部分は既にコード化されています)。今のところ、コントロールをループして名前で検索するオブジェクト リストを含む非表示のテーブルがあります (Me.Controls コレクションを使用)。しかし、動的に作成されたコントロールに特別な一意のコードがあるかどうかを知っている人はいますか?
あると思いますが、わかりません……。
どんな助けでも大歓迎です!
ドロン。
すべてのコントロールには、Handle
固有でなければならないプロパティがあります。それをさらに制御したい場合 (駄洒落を許してください)、Tag
各コントロールのプロパティを新しい GUID に設定できます。次に、それを使用してそれらを一意に識別できます。
Dim dynamicControl As Control = ...
dynamicControl.Tag = Guid.NewGuid().ToString()
Name
ただし、コントロールを一意に識別する通常の方法であるため、プロパティに使用している値がまだ一意ではない理由がわかりません。
カスタム コントロールを使用している場合、これはかなり簡単に実行できますが、組み込みのコントロール (ラベル、ボタン、テキスト ボックスなど) を使用している場合は、少しトリッキーになります。
私は似たようなことをしているがここでカスタムコントロールを使用している誰かのために、このような質問に答えました.
組み込みコントロールの場合、いくつかのことができます。Steven Doggart が言及したように Tag プロパティに値を設定するか、使用するコントロールを継承する独自のカスタム クラスを作成し、必要な識別プロパティを追加することができます。
ID を格納する方法を選択すると、実際にMe.Controls
コレクションで LINQ を使用して、タイプ/タグ/その他によってすべてのコントロールを取得できます。そうは言っても、フォーム上の個々のコントロールに簡単にアクセスできる/予測可能な一意の識別子が与えられているとは思いません。特定のコントロールを具体的に参照したい場合は、実行時に想定できる識別子を与える必要があります。そうしないと、あなたを含む誰も、どのコントロールを操作する必要があるかを正確に知ることができません。
作成時に Control.Name プロパティを設定していると思いますか?
あなたはControl.Handleの後にいるかもしれません?
Public Class Form1
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
' create controls
For i As Integer = 1 To 5
Dim t As New TextBox
t.Name = "TextBox" & i
Me.Controls.Add(t)
Next
' list controls
For Each c As Control In Me.Controls
Debug.Print(c.Name & " has handle " & c.Handle.ToString)
Next
' check fopr existence of controls
For i As Integer = 0 To 7
If Me.Controls.ContainsKey("TextBox" & i) Then
Debug.Print("TextBox" & i & " exists")
Else
Debug.Print("TextBox" & i & " doesn't exist")
End If
Next
End Sub
End Class
このプログラムは、次の出力を作成します。
TextBox1 has handle 2361834
TextBox2 has handle 3739570
TextBox3 has handle 8130020
TextBox4 has handle 5048814
TextBox5 has handle 6425036
TextBox0 doesn't exist
TextBox1 exists
TextBox2 exists
TextBox3 exists
TextBox4 exists
TextBox5 exists
TextBox6 doesn't exist
TextBox7 doesn't exist