C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[6]: VB.Net ContextMenuStripの階層について


(過去ログ 136 を表示中)

[トピック内 7 記事 (1 - 7 表示)]  << 0 >>

■80177 / inTopicNo.1)  VB.Net ContextMenuStripの階層について
  
□投稿者/ たーぼー (3回)-(2016/06/19(Sun) 20:05:30)

分類:[VB.NET/VB2005 以降] 

開発環境 Microsoft Visual Studio Community 2015
使用言語 VB.Net (Visual Basic 2015)
フレームワーク .NET Framework 4.5.2

OS Windows7 Professional SP1 64bit
CPU Intel(R) Core(TM) i7 CPU 870 @2.93GHz 2.93GHz
RAM 16.0GB

前回http://bbs.wankuma.com/index.cgi?mode=al2&namber=80139で質問させていただいた者です。
おかげさまでドラッグ&ドロップ部分については満足のいく状態にできました。

たびたび申し訳ありませんが相談に乗ってください。

<やりたいこと1>
ラベルを右クリックしたらコンテキストメニューを表示させ、メニュー内のアイテムをクリックしたら
対象のラベルのtextプロパティをアイテムの文字列で書き換える

<やりたいこと2>
コンテキストメニューが3〜4階層、合計アイテム数が100個以上になる予定のため、
下記の手順でラベルのtextプロパティ書き換え部分をクラス化したい

(手順1)
コンテキストメニューの特化クラス「ContextMenuStripEX1」を作成し、
Openingイベント時に別途用意したControl変数「ctrl」にsender.sourcecontrolを代入する
(これでどのコントロールが右クリックされたのかを把握できる)

(手順2)
Handles Me.ItemClickedイベントでctrl.Text = e.ClickedItem.Text とすることで、処理を実現する


<行き詰った点>
手順2のMe.ItemClickedはコンテキストメニューの1階層目のクリックしかトラップできないようで、
2階層目以降をクリックしても何も起こらない。

<教えて欲しい点1>
階層に関わらず、コンテキストメニューがクリックされたこをトラップするには、どのような記述をすれば良いか

<教えて欲しい点2>
手順2で「次の階層が存在するアイテム」をクリックしても、それ自体はctrl.Textにしたくないため、
コンテキストメニュー内で特定のアイテムが、子アイテム(?)を持っているか調べる方法(プロパティ名)


以上です。「googleでこんなキーワードで検索すると良い」といったヒントでも構いませんので、
どなたかご教授いただけませんでしょうか。

以上、よろしくお願いいたします。
引用返信 編集キー/
■80178 / inTopicNo.2)  Re[1]: VB.Net ContextMenuStripの階層について
□投稿者/ たーぼー (4回)-(2016/06/19(Sun) 20:22:52)
補足ですが、今のところコンテキストメニューのアイテムはデザイン画面で手動で設定しています。
引用返信 編集キー/
■80179 / inTopicNo.3)  Re[2]: VB.Net ContextMenuStripの階層について
□投稿者/ たーぼー (5回)-(2016/06/19(Sun) 21:56:49)
(追記)

form1.Loadの部分に、「AddHandler ToolStripMenuItem74.Click ,AddressOf ToolStripMenuItems_Click 」のような記述をして、
「74」の部分はループ処理か何かでまとめてしまう 

という処理を思いつきました。ちょっと試してみます。
引用返信 編集キー/
■80180 / inTopicNo.4)  Re[3]: VB.Net ContextMenuStripの階層について
□投稿者/ たーぼー (6回)-(2016/06/20(Mon) 03:54:34)
2016/06/20(Mon) 12:30:21 編集(投稿者)
2016/06/20(Mon) 08:55:56 編集(投稿者)
2016/06/20(Mon) 03:54:50 編集(投稿者)

自己解決しました。

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
        '右クリックメニューの各項目をToolStripMenuItems_Clickに繋げる処理
       Dim buf As ToolStripMenuItem
        For Each buf In ContextMenuStripEX1.Items
            If buf.DropDownItems.Count = 0 Then
                AddHandler buf.Click, AddressOf ToolStripMenuItems_Click
            Else
                Call bufbufA(buf)
            End If
        Next
    End Sub

    Private Sub bufbufA(bufbuf As ToolStripMenuItem)
        For Each bufbuf In bufbuf.DropDownItems
            If bufbuf.DropDownItems.Count = 0 Then
                AddHandler bufbuf.Click, AddressOf ToolStripMenuItems_Click
            Else
                Call bufbufA(bufbuf)
            End If
        Next
    End Sub


    Private Sub ToolStripMenuItems_Click(sender As Object, e As EventArgs)
        (クリックが発生したラベルのTextプロパティをsender.Textに書き換える処理)
    End Sub


これで想定通りの挙動をするようになりました。

引用返信 編集キー/
■80182 / inTopicNo.5)  Re[4]: VB.Net ContextMenuStripの階層について
□投稿者/ たーぼー (7回)-(2016/06/20(Mon) 08:55:33)
No80180 (たーぼー さん) に返信
> 2016/06/20(Mon) 03:54:50 編集(投稿者)
>
> 自己解決しました。
>
> Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
> '右クリックメニューの各項目をToolStripMenuItems_Clickに繋げる処理
> Dim buf As ToolStripMenuItem
> For Each buf In ContextMenuStripEX1.Items
> If bufbuf.DropDownItems.Count = 0 Then
> AddHandler bufbuf.Click, AddressOf ToolStripMenuItems_Click
> AddHandler bufbuf.MouseEnter, AddressOf ToolStripMenuItems_MouseEnter
> Else
> Call bufbufA(bufbuf)
> End If
> Next
> End Sub
>
> Private Sub bufbufA(bufbuf As ToolStripMenuItem)
> For Each bufbuf In bufbuf.DropDownItems
> If bufbuf.DropDownItems.Count = 0 Then
> AddHandler bufbuf.Click, AddressOf ToolStripMenuItems_Click
> Else
> Call bufbufA(bufbuf)
> End If
> Next
> End Sub
>
>
> Private Sub ToolStripMenuItems_Click(sender As Object, e As EventArgs)
> (右クリックが発生したラベルのTextプロパティをsender.Textに書き換える処理)
> End Sub
>
>
> これで想定通りの挙動をするようになりました。


1箇所疑問が。
コンテキストメニュー内に仕切り線を入れた状態だと、Form1_Loadの処理が仕切り線の部分で止まってしまい、
それ以降の処理が何もされない状態になってしまいます。
エラーで止まるわけではなく、ビルドは完了してフォームも表示されますが、
必要な機能が抜け落ちた状態になってしまいます。
引用返信 編集キー/
■80197 / inTopicNo.6)  Re[5]: VB.Net ContextMenuStripの階層について
□投稿者/ shu (888回)-(2016/06/21(Tue) 11:44:57)
No80182 (たーぼー さん) に返信
>> For Each buf In ContextMenuStripEX1.Items
For Each buf In ContextMenuStripEX1.Items.OfType(Of ToolStripMenuItem)


>> Private Sub bufbufA(bufbuf As ToolStripMenuItem)
>> For Each bufbuf In bufbuf.DropDownItems
同様の変更を行う。
この書き方(Eachの後のbufbufと引数のbufbufが同じ、
Eachの後のbufbufがbufbuf.DropDownItemsの置き換えに
なっている)はよくないのでFor Each 用の変数は別途用意された方がよいです。
引用返信 編集キー/
■80206 / inTopicNo.7)  Re[6]: VB.Net ContextMenuStripの階層について
□投稿者/ たーぼー (8回)-(2016/06/22(Wed) 23:52:14)
2016/06/25(Sat) 22:33:26 編集(投稿者)

No80197 (shu さん) に返信
> ■No80182 (たーぼー さん) に返信
> >> For Each buf In ContextMenuStripEX1.Items
> For Each buf In ContextMenuStripEX1.Items.OfType(Of ToolStripMenuItem)
>
>
> >> Private Sub bufbufA(bufbuf As ToolStripMenuItem)
> >> For Each bufbuf In bufbuf.DropDownItems
> 同様の変更を行う。
> この書き方(Eachの後のbufbufと引数のbufbufが同じ、
> Eachの後のbufbufがbufbuf.DropDownItemsの置き換えに
> なっている)はよくないのでFor Each 用の変数は別途用意された方がよいです。


なるほど、Itemsの後に更に条件を指定できたのですね。
bufbufはちょっとバフバフしすぎていて見間違えいました。

どうもありがとうございました。無事に問題が解決しました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -