- PR -

「VB.NET」FORM上のコントロールを非明示的に一括処理したい

1
投稿者投稿内容
ヤマザキ
常連さん
会議室デビュー日: 2004/05/10
投稿数: 22
投稿日時: 2004-05-20 12:21

いつもお世話になっております。
VB.NET での質問をしに、またまたやってまいりました。

FORM上に何個かボタンを置いて、それらを同一の数種のイベントに
ハンドルさせているのですが、ボタンが増えたり、イベントを増やしたり
するたびに、コードが煩雑化または漏れがあったりと、あまり効率が
よくないと思い、

For Each btnAll In (Form1の全てのボタン)
AddHandler btnAll.MouseHover, AddressOf btnMouseHover
AddHandler btnAll.Click, AddressOf btnClick
Next

の用に、FORM上にあるボタンを全部、何も考えずまとめて関連づけたい
と思っているのですが、(Form1の全てのボタン) ここのところの
指定方法がわかりません。

たぶん、基礎的な問題のような気がするのですが。。。
というか、そもそもこういう事はできないのでしょうか。
一郎
ぬし
会議室デビュー日: 2002/10/11
投稿数: 1081
投稿日時: 2004-05-20 13:11
Form.Controlsプロパティを使って再帰的に処理を行えば良いと思います。

ここが参考になるかも
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=8270&forum=7
ヤマザキ
常連さん
会議室デビュー日: 2004/05/10
投稿数: 22
投稿日時: 2004-05-20 13:45
一郎様

ありがとうございました。
参考にして、以下のようにすっきりうまくいきました。
似たイメージは持ててたのですが、結果がついてこないのは、
やはり基礎がなってない証拠ですね。

Dim ctrl As Control
For Each ctrl In Me.Controls
 If TypeOf ctrl Is Button Then
  AddHandler ctrl.Click, AddressOf cmdButtons_Click
  AddHandler ctrl.MouseHover, AddressOf cmdButtons_MouseHover
  AddHandler ctrl.MouseLeave, AddressOf cmdButtons_MouseLeave
 End If
Next
一郎
ぬし
会議室デビュー日: 2002/10/11
投稿数: 1081
投稿日時: 2004-05-20 14:31
あれ・・・・
Panel等の中のボタンのイベントは処理しなくても良いんですか?
再帰的にしないと、あるコントロール(たとえばPanel)の子コントロールは処理の対象外になりますよね。
ヤマザキ
常連さん
会議室デビュー日: 2004/05/10
投稿数: 22
投稿日時: 2004-05-20 14:57
一郎様

度々アドバイスありがとうございます。
とりあえず子コントロールはないので、これで。
拾えなかったコントロールがあったら、その時にでも(^^;

その前に、意味不明?なエラーでずっと途方に暮れてました(笑)

Dim ctrl As Control
For Each ctrl In Me.Controls
の部分で、Me.Controls にすると、イベントは関連できたのですが、
アプリ終了時、以下のようにエラー中断してしまいます。
「このフォームの MDIParent として指定されたフォームは MDIContainer ではありません。」

で、Meがだめなのか、と思い、
Dim f As New frmMain
Dim ctrl As Control
For Each ctrl In f.Controls

とすると、コントロールは認識するんですが、
肝心のAddHandler がうまくいかずに関連づけできません(謎)
中断のエラーはなく普通に終了できます。

Meの使いかたや、MDIフォームで何か制限とかあるのでしょうか。。



MDIフォーム表示コード部:
Private Sub cmdButtons_Click(ByVal sender As System.Object, ByVal e As EventArgs)
Dim fmdi As Form
Dim frm As New Form
Select Case sender.name
 Case "cmdButton1"
  frm = New frmChild1(Me)
 Case "cmdButton2"
  frm = New frmChild2(Me)
 Case "cmdButton3"
  :

End Select

For Each fmdi In Me.MdiChildren
 If fmdi.Name = frm.Name Then
  Exit Sub
 End If
Next
frm.MdiParent = Me
frm.Show()

ヤマザキ
常連さん
会議室デビュー日: 2004/05/10
投稿数: 22
投稿日時: 2004-05-20 15:02
皆様、大変失礼しました。
どうも会議室を選択する際、Insider.NET を選ぶつもりが。。
申し訳ございません。

さて、どうしよう。。。
1

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