tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトル複数コントロール選択
記事No9104
投稿日: 2009/06/22(Mon) 13:39
投稿者VB
vb2008 winxp

ラベルや、テキストボックス、ラジオボタン、チェックボックス、ボタン等を
『Shift + 左クリック』で各コントロールを選択し
その選択されたものが、1つ目はバックカラーが青色。
2つ目以降は、水色という形で複数選択したいのですが。
簡単に『Shift + 左クリック』で複数選択と表示させるものは、
VB2008であるのでしょうか?

[ツリー表示へ]
タイトルRe: 複数コントロール選択
記事No9107
投稿日: 2009/06/23(Tue) 13:50
投稿者VB
複数選択をするにあたって、
http://shinshu.fm/MHz/88.44/archives/0000036987.html
'あらかじめイベントが発生するように宣言しておく
Private WithEvents btn As Button
'動的にコントロールを配置する
For i As Integer = 0 To 3
    btn = New Button
    Me.Controls.Add(btn)
    AddHandler btn.Click, AddressOf btn_Click   '動的にイベントを関連付ける
    btn.Left = 10
    btn.Top = btn.Height * i + 10
Next

上記のサイトに動的に追加したコントロールに
イベントを追加する方法があったのでこれを使おうと思ったのですが。
追加するコントロールの宣言が配列だった場合、
どのように記述すればよいのでしょうか?
Public btn() As Button

[ツリー表示へ]
タイトルRe^2: 複数コントロール選択
記事No9109
投稿日: 2009/06/23(Tue) 15:10
投稿者VB
>http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1026727510
上記のサイトを参考にしました。

[ツリー表示へ]
タイトルRe^3: 複数コントロール選択
記事No9111
投稿日: 2009/06/23(Tue) 20:00
投稿者VB
For Each ctl As Control In SplitContainer1.Panel1.Controls
    If TypeOf ctl Is Label Then
        AddHandler CType(ctl, Label).Click, AddressOf Button_Click
    End If
Next

Private Sub Button_Click(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs)
                略
End Sub

上記のようにパネル上にあるラベルのコントロール全てに
イベントを追加したのですが、
例えばLabel1をクリックしたら、Button_Click関数が
パネル上にあるコントロール数分呼ばれてしまうのですが
全てのラベルをクリックしたと同じことになるという事でしょうか?

そしてこれを解消する方法は、ありますでしょうか?
アドバイス宜しくお願い致します。

[ツリー表示へ]
タイトルRe^4: 複数コントロール選択
記事No9114
投稿日: 2009/06/24(Wed) 16:17
投稿者るしぇ
そんなことないと思う。

とりあえずデバッグ出力(Debug.Writeline)を使って
どのコントロールに何回 AddHandler してるか
出力してみてください。

その後、イベントの引数 sender にイベントを起こした
コントロールへの参照が格納されているから、同様に
どのコントロールが何回イベントを起こしているか
出力してみてください。

[ツリー表示へ]
タイトルRe^4: 複数コントロール選択
記事No9115
投稿日: 2009/06/25(Thu) 03:26
投稿者魔界の仮面弁士
> For Each ctl As Control In SplitContainer1.Panel1.Controls
>     If TypeOf ctl Is Label Then
>         AddHandler CType(ctl, Label).Click, AddressOf Button_Click
>     End If
> Next

For Each lbl In SplitContainer1.Panel1.Controls.OfType(Of Label)()
    AddHandler lbl.Click, AddressOf Button_Click
Next

と書くこともできますよ。


> 例えばLabel1をクリックしたら、Button_Click関数が
> パネル上にあるコントロール数分呼ばれてしまうのですが
> 全てのラベルをクリックしたと同じことになるという事でしょうか?

同じ Label に対して複数回 AddHandler を行っているのだとすれば、
1 つの Label クリックに対して、複数回 Button_Click が呼ばれる事になりますが、
1 つの Label に対して 1 回しか AddHandler していないなら、1 回しか呼ばれません。

[ツリー表示へ]
タイトルRe^5: 複数コントロール選択
記事No9154
投稿日: 2009/07/08(Wed) 19:11
投稿者VB
> For Each lbl In SplitContainer1.Panel1.Controls.OfType(Of Label)()
>     AddHandler lbl.Click, AddressOf Button_Click
> Next
↑勉強になりました。

> 同じ Label に対して複数回 AddHandler を行っているのだとすれば、
> 1 つの Label クリックに対して、複数回 Button_Click が呼ばれる事になりますが、
> 1 つの Label に対して 1 回しか AddHandler していないなら、1 回しか呼ばれません。
なるほど、そうなんですか。。

ソースを確認したところ、
何度もAddHandlerしてしまっていました。
そこで、質問なのですが。
AddHandlerが2重になってしまわないように
1度、AddHandlerをしてしまったことを確認することは出来るのでしょうか?
それか、AddHandlerをいったんリセットみたいなことは、出来ますでしょうか?

[ツリー表示へ]
タイトルRe^6: 複数コントロール選択
記事No9155
投稿日: 2009/07/08(Wed) 19:30
投稿者魔界の仮面弁士
> AddHandlerをいったんリセットみたいなことは、出来ますでしょうか?
AddHandler の逆は RemoveHandler です。

> AddHandlerが2重になってしまわないように
> 1度、AddHandlerをしてしまったことを確認することは出来るのでしょうか?
AddHandler は勝手に行われてしまうわけではなく、プログラムからの指定によって
呼び出されるものなのですから、割り当てたかどうかはご自身で管理できますよね。

[ツリー表示へ]
タイトルRe^7: 複数コントロール選択
記事No9159
投稿日: 2009/07/09(Thu) 19:10
投稿者VB
> > AddHandlerをいったんリセットみたいなことは、出来ますでしょうか?
> AddHandler の逆は RemoveHandler です。
ありがとうございます。
試してみます。

> AddHandler は勝手に行われてしまうわけではなく、プログラムからの指定によって
> 呼び出されるものなのですから、割り当てたかどうかはご自身で管理できますよね。
確かにそうですよね。。
動的に作ったコントロールにAddHandlerをしているもので、
色々、大雑把に作っていたせいもあり
ここでめんどくさいことになりました。f(--;
すでにAddHandlerしてるよって言うのが何かしらの値で分かれば
if文で一気に方が付いたんですけどね。

アドバイスありがとうございました。

[ツリー表示へ]
タイトルRe^8: 複数コントロール選択
記事No9161
投稿日: 2009/07/09(Thu) 20:41
投稿者るしぇ
ソースコードを『AddHandler』で全検索して
AddHandler したコントロールをコレクションにでも
入れておけば済む話では?

[ツリー表示へ]