2010-12-28 2 views
1

VB.NETでコントロールのメソッドの中にコントロールを参照するにはどうすればよいですか?コントロールのメソッド(クラスの "私"のような)からコントロールを参照するにはどうすればよいですか?

たとえば、テキストボックスにテキストボックスのテキストが変更されるたびにメッセージボックスが表示されるようにしたいとします。コードは次のようになります:

Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged 

msgbox("The text is:"+ Me.text)  

' ok the line above wont work i already know that, because "Me" refer to the form, 
' not the control textbox1 
' how i will refer to the textbox1's text??? 
' i dont want to use "textbox1.text" is there a way similar like the "Me" is for forms? 
' because i want to copy-paste a code like this in a lot of controls and do not want to 
' have to change in every copy the name to each control name 

End Sub 

私は自分自身を明確にしたいと思います。私の英語は少し改善が必要です:D

+0

... i「は、MyBase、親ミー」を探してみましたが、私は、コントロールの自己reffer意志何かを見つけるdidntの:( –

答えて

4

いいえ、それを可能にするキーワードはありません。ただし、コントロールによって生成されたすべてのイベントは、特定のコントロールがそのイベントを発生させたかどうかを判断するために使用できるsenderパラメーターで渡されます。

このパラメータは、可能なコントロールを表す可能性があるため、常にObjectと入力されるため、固有のメンバにアクセスする必要がある場合は、より具体的なコントロールクラスにダウンキャストする必要があります露出する。 TextBoxコントロールで発生したイベントを処理しているので、 はのである必要がありますので、アップキャストを処理するには単にDirectCastを使用することができます。 InvalidCastExceptionが投げられることを心配する必要はありません。例えば

、あなたの上記の例はなる:

Private Sub TextBox1_TextChanged(ByVal sender As Object, ByVal e As EventArgs) Handles TextBox1.TextChanged 
    Dim textBox As TextBox = DirectCast(sender, TextBox) 
    MessageBox.Show("The text is: " & textBox.Text) 
End Sub 


言われて、あなたの質問に私に飛び出す事についてのカップルがあること:

  1. どれでも問題を解決するためのあなたのアプローチがコードを「コピー・ペースト」している時は、やめて一歩踏み出し、最終的な目標を達成するためのよりよい方法があるかどうかを判断してください。例えば

    あなたが特定のイベントが発生するたびに同じように反応するフォーム上すべてのテキストボックスが必要な場合は、既存のTextBoxコントロールをサブクラス化し、一つの場所にあなたのコードのすべてを統合する検討すべきです。カスタム機能を追加するには、ほとんどの標準コントロールを継承することができます。これは、コードをコピーしてプロジェクトの複数の場所に貼り付けるよりもはるかに優れたソリューションです。バグを追跡したり、その機能を変更したりする必要がある場合は、コードではなく複数の場所で変更するだけで済みます。やや賢明なメリットとして、Meを使用して、そのサブクラスを編集しているときにそのコントロールを参照できるようになります。

  2. +記号ではなく、VB.NETの&演算子を使用して文字列を連結(結合)することを常に推奨します。または、おそらくさらに良いのは、String.ConcatまたはString.Formatメソッドです。

  3. MessageBox.Showではなく、VB.NETでMsgBoxを使用する理由はありません。いいえ、これはアプリケーションのパフォーマンスを向上させることはありませんが、.NET言語に慣れるのは良い習慣です。

+0

あなたが一日先生を救った!!!本当にありがとうございました!!! –

+0

+1 – MarkJ

+0

@MarkJ:もちろん、具体的な必要性に応じて、私はちょうど[Extenderプロバイダ](http://msdn.microsoft.com/en-us/library/d6c1xa43.aspx)を検討していますが、TextBoxのサブクラス化ではありません。 ;-) –

0

送信者変数には、アクセスするTextBoxインスタンスが含まれています。送信者をTextBoxに変換するだけで済みます。

+0

あなたの答えMarcelもありがとう! –

関連する問題