- PR -

クリックしたLABEL名を取得するには

投稿者投稿内容
のん
会議室デビュー日: 2006/02/28
投稿数: 9
投稿日時: 2006-02-28 11:16
はじめまして。.NETは始めて2ヶ月程度の初心者です。

現在フォーム上に100個近くのLABELがあります。
そのLABELのいずれかをクリックしたときに
別のフォームを表示させ、そのフォーム上のtextboxに
LABELのテキストのデータを表示させようと考えています。

最初はLABELひとつひとつのクリックイベントに書き込もうと
思ったのですが、LABELの数が多いだけに、この作業だけで、かなりの行数になってしまいます。
 そこで、クリックしたLABELが取得できれば、そのLABELのTEXTをフォームのテキストボックスへといったイベントを起こすことができればと思いました。

なにか、この作業をまとめて行うことは可能でしょうか?
可能でしたら、教えていただけないでしょうか?

よろしくお願いいたします。


のん
会議室デビュー日: 2006/02/28
投稿数: 9
投稿日時: 2006-02-28 11:22
すいません。開発環境はMicrosoft visual basic.NET2003です。OSはWINDOWS XP Professionalです。よろしくお願いいたします。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-02-28 11:24
引用:

たんばりんさんの書き込み (2006-02-28 11:16) より:

最初はLABELひとつひとつのクリックイベントに書き込もうと
思ったのですが、LABELの数が多いだけに、この作業だけで、かなりの行数になってしまいます。
そこで、クリックしたLABELが取得できれば、そのLABELのTEXTをフォームのテキストボックスへといったイベントを起こすことができればと思いました。


普通はコントロールの配列を作成し、イベント ハンドラを統合します。

  コントロールの配列を作成する

後は、sender 引数から煮るなり焼くなりしてください。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
YAS
ベテラン
会議室デビュー日: 2006/02/15
投稿数: 59
投稿日時: 2006-02-28 11:49
たんばりんさん,こんにちは。

じゃんぬねっとさんのおっしゃる通り,Addhandlerステートメントかプロシージャ宣言の
Handles句でイベントハンドラの統合すればよいと思います。

ただ,すでにフォームデザイナでラベルを100個おいてしまっていて,それを
できるだけ生かしたいのなら,下のような方法でもイベントの処理を統合出来ると思います。参考にしてみてください。

コード:

Public Class Form1

Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

For Each Ctrl As Control In Me.Controls
If Ctrl.GetType Is GetType(Label) Then
Dim MultiEvent As New MultiEvent(Ctrl)
End If
Next

End Sub

End Class

Class MultiEvent
Inherits Control

Private _Label As Label

Sub New(ByVal Label As Label)
_Label = Label
AddHandler _Label.Click, AddressOf Label_Click
End Sub

Private Sub Label_Click(ByVal sender As Object, ByVal e As System.EventArgs)
Debug.WriteLine(DirectCast(sender, Label).Name) '〜 処理 〜
End Sub

End Class





[ メッセージ編集済み 編集者: YAS 編集日時 2006-02-28 11:59 ]
YAS
ベテラン
会議室デビュー日: 2006/02/15
投稿数: 59
投稿日時: 2006-02-28 12:02
先のコードで動くことは動くのですが,MultiEventをちゃんと
宣言しないと,いつまでもメモリに残ったり,逆にGCに片づけられ
ちゃったりするかも。(そこのところは実はよく知りません)

[ メッセージ編集済み 編集者: YAS 編集日時 2006-02-28 12:04 ]
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-02-28 12:07
引用:

YASさんの書き込み (2006-02-28 11:49) より:

ただ,すでにフォームデザイナでラベルを100個おいてしまっていて,


おー、そっか。(^^)

その Label 郡が「表」という概念を持ち合わせているならば、
動的に生成した方が、何かと保守性は良いのでしょうが、
そうでないのであれば、デザイナは重くなりますがベタに貼った方が良いかもしれませんね。

引用:

If Ctrl.GetType Is GetType(Label) Then


間違ってはいませんけど、ちょっと回りくどいような...

コード:

    If TypeOf Ctrl Is System.Windows.Form.Label Then


で良いんじゃないですか?

引用:

Class MultiEvent
  Inherits Control


ここは、何故 Inherits Control なのでしょうか?

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
YAS
ベテラン
会議室デビュー日: 2006/02/15
投稿数: 59
投稿日時: 2006-02-28 12:12
引用:

If TypeOf Ctrl Is System.Windows.Form.Label Then


おぉ!勉強になります。このやり方は気がつきませんでした。
ありがとうございました。

引用:

ここは、何故 Inherits Control なのでしょうか?


すみません。消し忘れです。
最初はフォームに貼り付けて,プロパティにラベルを設定するような
方法を考えていて,それならControlを継承すればいいかなと思い,
試した痕跡です。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-02-28 12:30
別クラスにしない方が良い場合もあると思って、こういうスタンダードな方法も投下。

コード:

    Private Sub Form_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load
        For Each one As Control In Me.Controls
            If TypeOf one Is Label Then
                AddHandler one.Click, AddressOf AllLabel_Click
            End If
        Next one
    End Sub

    Private Sub AllLabel_Click(ByVal sender As Object, ByVal e As System.EventArgs)
        Dim hLabel As Label = DirectCast(sender, Label)
        MessageBox.Show(hLabel.Name & " を Click したと思われ")
    End Sub


クラスにするにしてもインナークラスにした方が良いかもしれませんね。
sender の型を問題視するならば、自作の Delegate で...

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌

スキルアップ/キャリアアップ(JOB@IT)