2016-12-11 1 views
-3

私は約50のラベルを持つアプリケーションがあります。これらのラベルには数字が表示されます。 ユーザーがラベルをクリックすると、数字を編集ボックスに書き込む必要があります。 これはうまくいきますが、唯一の問題は、以下のような50個の関数を追加したときと同じときはいつでもそうです。私はこのための共通の機能があるのだろうかと思っていた 備考:ラベルには異なる名前があります。したがって、可能ならば、フォーム上のすべてのラベルに対してこれが有効になります。ラベルのクリックイベント

Private Sub LI_L_Click(sender As Object, e As EventArgs) Handles LI_L.Click 
    cmbOBJID.Text = LI_L.Text 
End Sub 
+0

ラベルはグループボックス内にあるなど、他のラベルと区別するために共通のものがありますか? –

+0

すべてが同じ場所に書き込む場合は、すべてのラベルをとしてリストすることでこのコードを単純化できます。 。 。 LI_L.Click、LI_M.clickを処理します。 。 。 。等々。次に、特定のラベルをsender.text – peterG

+2

に置き換えてください。[MSDN](https://msdn.microsoft.com/en-us/library/aa289500(v=vs.71).aspx) – Abood

答えて

0

フォームデザイナでは、すべてのラベルのハンドラを同じ機能に設定できる必要があります。次に、 "sender"パラメータを使用して、どのラベルがイベントを発生させているかを判断することができます。

enter image description here

機能がリンクしているすべてのコントロールは、「ハンドル」キーワードの後に​​リストされても、どのように注意してください。これは、Visual StudioのUIプロパティグリッドを使用する場合には、すべてのラベルにコードを接続する別の方法です。

Private Sub LI_Click(sender As Object, e As EventArgs) Handles Label1.Click, Label2.Click, Label3.Click 
    cmdOBJID.Text = DirectCast(sender, Label).Text 
End Sub 
+0

なぜ賛成投票ですか?それは完全に良い答えであり、すぐに使用できます。イベントハンドラに追加するすべてのラベルを選択して上記の手順に従い、無差別ループの落とし穴を避けてください。アップボーニング。 –

0

それはそれはほんの数ラベルよりも長く退屈になります

Private Sub LI_Click(sender As Object, e As EventArgs) Handles Label1.Click, Label2.Click, Label3.Click 

のスタイルで1つのハンドラに複数のイベントを追加するのは簡単ですが。

ハンドラを追加する必要があるラベルを参照する方法が見つかると、ハンドラをプログラムで追加できます。この例では、私は「GroupBoxOptions」という名前のグループボックス内のすべてのラベルを置く:

Option Infer On 
Option Strict On 

Public Class Form1 

    Sub TransferDataToEditBox(sender As Object, e As EventArgs) 
     Dim lbl = DirectCast(sender, Label) 
     tbEditThis.Text = lbl.Text 

    End Sub 

    Sub InitLabelHandlers() 
     For Each lbl In GroupBoxOptions.Controls.OfType(Of Label) 
      AddHandler lbl.Click, AddressOf TransferDataToEditBox 
     Next 

    End Sub 

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 
     InitLabelHandlers() 

    End Sub 

End Class 

あなたはハンドラを使用するラベルを選択するいくつかの他の方法を持っていることがあります。

+1

** RemoveHandlers **を忘れないでください。追加する場合は、それらを削除する必要があります。 – Codexer

+0

@Zagglerラベルなどの管理対象コントロールの場合は問題ありません。 –

+1

「管理対象のコントロール」ほど簡単ではありません。重要な問題は、イベントハンドラがそのコンテナよりも寿命の長いオブジェクトにアタッチされているかどうかです。その場合は、手動でハンドラを削除する必要があります。それ以外の場合は、オブジェクトのコンテナが破棄されたときにイベントハンドラが自動的に削除されます。私はそれがおそらくあなたが "管理されたコントロール"の意味であると考えていますが、明示的にするのは良いことです。 –

-1

フォーム上のすべてのラベルコントロールをトラバースして、ユーザーがラベルをクリックしたときに実行するイベントをAddHandler関数で割り当てることは、とても簡単ですばやいソリューションです。コードで

For Each c As Control In Me.Controls.OfType(Of Label) 
     AddHandler c.Click, AddressOf myLabelClick 
    Next 

prevousスニペット、タイプラベルのすべてのWinフォームコントロールの上に私たちのループ付き。そのようなループは、イベントを割り当てる必要のあるラベルがたくさんある場合に便利です。それぞれに対して、コントロールのClickイベントを、カスタマイズされたmyLabelClickという名前のSubに関連付けます。そのサブルーチンは、次のようになります。

Private Sub myLabelClick(sender As Object, e As EventArgs) 
    cmdObjId.Text = DirectCast(sender, Label).Text 
End Sub 

ここでは、そのTextプロパティにアクセスし、それに応じてcmdObjId.Textを変更する(クリックが行われたためにコントロールを表す)、送信者の変数を使用しています。

+0

これは、それらが追加されるべきかどうかにかかわらず、フォーム上のすべてのラベルに対して同じハンドラを追加します。 OPがすべてのラベルに同じ命名体系を使用していた場合、これは問題になります –

+0

@DavidWilson:私の答えは、ユーザーが私たちに与えた情報に基づいています。ラベルのすべてを考慮する必要があるとは限らないことを指摘した場合(おそらくラベルの名前やその他のフィルタによって)、回答はそれに応じて変更する必要があります。私はdownvoteを理解していないが、ちょっと、それはコミュニティの選択です – hypnos

+0

本当、 - 私はdownvoteが必要だったとは思わない。コメントがよかったでしょう。 –

関連する問題