0

ボタンやチェックボックスなどのオブジェクトをフォームに動的に追加するプログラムを作成しています。

インスタンスごとにハンドラーが追加されるため、各オブジェクトのClickイベントに対して特定の関数が呼び出されます。

さて、そのハンドラーが呼び出されたときに、Clickイベントを発生させたオブジェクトをどのように操作できますか?場所、テキスト、親、何も変更できないため、Senderオブジェクトはここでは役に立ちません。

オブジェクトは動的に作成されているため、残念ながらインスタンス名は常に同じになります。したがって、button1.Text="Button1"のようなことを単純に行うことはできません。

実行されるアクションは同じであるため、すべてのタイプに対して新しいサブルーチンを作成したくありません...では、これらのオブジェクトをどのように操作できますか?

最後に、操作されている27の異なるオブジェクトタイプがあり、それらを1つのサブで操作したいと思います。

助けてくれてありがとう!

4

3 に答える 3

4

これは Click イベントを発生させたオブジェクトになるため、送信者が必要なようです。必要な型にキャストする方法を見つけ出すだけです。

場所、テキスト、および親を操作するだけの場合は、Control へのキャストで十分です。

Dim c As Control = CType(sender, Control)

それ以外の場合は、特定の型にキャストする必要があります。つまり、型ごとに異なるルーチンが必要になります。

もう 1 つのオプションは、レイト バインディングを有効にすることです。これは、VB では Option Strict Off であると私は信じています。その後、キャストしなくてもコントロール プロパティを参照できます。.NET は実行時にプロパティを検索します (プロパティが存在しない場合は例外がスローされることに注意してください)。

于 2009-10-15T23:51:10.983 に答える
3

送信者をキャストして、Control必要なことを実行できます(すべてのオブジェクトはコントロールですよね?)

于 2009-10-15T23:50:12.717 に答える
2

ハンドラーを呼び出した入力のタイプがわかっている場合は、型キャストを使用して問題を解決できます。

Sub General_OnClick(ByVal sender As Object, ByVal e As EventArgs)
    Dim b As Button = sender
    b.Text = "Hello World!"
End Sub

そうでない場合は、Control代わりにキャストしてみてください。これにより、必要なことに応じて、十分な制御が得られる場合があります。そうでない場合は、いつでも次のようなことができます。

Sub General_OnClick(ByVal sender As Object, ByVal e As EventArgs)
    If TypeOf sender Is Button Then
        Dim b As Button = sender
        b.Text = "Hello World!"
    Else If TypeOf sender Is TextBox Then
        Dim tb As TextBox = sender
        tb.Text = "Goodbye cruel world!"
    End If
End Sub

編集: VB.Net に変換するように更新

于 2009-10-15T23:48:42.123 に答える