DOBON.NET DOBON.NETプログラミング掲示板過去ログ

ContextMenuStripに動的に項目を追加する

環境/言語:[XP、VB.NET(3.5)]
分類:[.NET]

3階層のメニューを作成したくて、下記コードを作成しましたが、上手くいきません。
イメージとしては、
「メニュー」をクリックすると「人名」が羅列されたToolStripMenuがでてきて、
各「人名」をクリックすると、「地域」が羅列されたToolStripMenuがでてくる。
そして、全ての人の「地域」が羅列されたToolStripMenuの一番下の項目は全ての地域が羅列された「全て」という項目がある。「全て」をクリックすると、「全地域」が羅列されたToolStripMenuが出てくる。
ですが、
実行すると、最後の「人名」のToolStripMenuだけに「全て」という項目が入り、他の「人名」のとこには入りません。アドバイスいただけますでしょうか。

<ここからコード>
'all.txtから項目を読み込みAllToolStripMenuItemインスタンスを作成
Dim sReaderC As New System.IO.StreamReader("all.txt", System.Text.Encoding.Default)
Dim AllToolStripMenuItem As ToolStripMenuItem = New ToolStripMenuItem()
AllToolStripMenuItem.Text = "全て"
While (sReaderC.Peek() >= 0)
AllToolStripMenuItem.DropDownItems.Add(sReaderC.ReadLine())
End While

'userdata.txtから項目を読み込みPlaceToolStripMenuItemインスタンス作成
' →PersonalToolStripMenuItemインスタンス作成
'  →ContextMenuStrip1作成
Dim strBufferB
Dim sReaderB As New System.IO.StreamReader("userdata.txt", System.Text.Encoding.Default)
While (sReaderB.Peek() >= 0)
Dim PersonalToolStripMenuItem As ToolStripMenuItem = New ToolStripMenuItem()
strBufferA = Split(sReaderB.ReadLine(), vbTab)
PersonalToolStripMenuItem.Text = strBufferA(0)
strBufferB = Split(strBufferA(1), "??")

For a As Integer = 0 To strBufferB.length - 1
Dim PlaceToolStripMenuItem As ToolStripMenuItem = New ToolStripMenuItem()
PlaceToolStripMenuItem.Text = strBufferB(a)
PersonalToolStripMenuItem.DropDownItems.Add(PlaceToolStripMenuItem)
Next
PersonalToolStripMenuItem.DropDownItems.Add(AllToolStripMenuItem)
ContextMenuStrip1.Items.Add(PersonalToolStripMenuItem)
End While
一つの ToolStripMenuItem は、一つの親しか持てません。どこかの ToolStripMenuItem.DropDownItems に Add すると、それまで追加されていた ToolStripMenuItem の子からは外されます。
ですので、毎回 AllToolStripMenuItem を作成して PersonalToolStripMenuItem.DropDownItems に Add していく必要があります。
// all.txt からの読み込みは、キャッシュされるので別に毎回 StreamReader を作っても大した問題はないでしょう。
// 気になるのなら、一旦 String 変数に全てを読み込ませて、StreamReader の代わりに StringReader で行読み出しを行うこともできますが。

DOBON.NET | プログラミング道 | プログラミング掲示板