- PR -

コンテキストメニューの再構築後サブメニューが表示されない

1
投稿者投稿内容
HIRO
常連さん
会議室デビュー日: 2004/10/28
投稿数: 41
投稿日時: 2005-04-04 11:11
ツリービューのコンテキストメニューを作成し、ツリービューのMouseUpイベント時に選択され
ているノードとマウスポインタの座標を取得して、コンテキストメニューを表示させているので
す。その際、コンテキストメニューのPopupイベントにてコンテキスト内にあるメニューのサブ
メニューを一旦削除し、ノードに応じてメニューを再構築して表示させるようにしているのです
が、2回目以降のサブメニュー表示がされません。

コード:
    WithEvents TEST_ContextMenu As New ContextMenu
    Dim TEST_Menu1 As New MenuItem

    Private Sub TreeView1_MouseUp(ByVal sender As Object, ByVal e As
                 System.Windows.Forms.MouseEventArgs) Handles TreeView1.MouseUp

        Dim Node As TreeNode = TreeView1.GetNodeAt(e.X, e.Y)

        If IsNothing(Node) = False Then
            Dim Viewpoint As New Point(e.X, e.Y)
            TEST_ContextMenu.Show(TreeView1, Viewpoint)
        End If

    End Sub

    ByVal e Private Sub Form2_Load(ByVal sender As Object,e As System.EventArgs)   Handles MyBase.Load
        TEST_ContextMenu.MenuItems.Add(TEST_Menu1)
    End Sub

    Private Sub TEST_ContextMenu_Popup(ByVal sender As Object, ByVal e As
                               System.EventArgs) Handles TEST_ContextMenu.Popup
        TEST_Menu1.MenuItems.Clear()
        Dim TEST_SubMenu1 As New MenuItem
        TEST_SubMenu1.Text = "TEST1"
        Dim TEST_SubMenu2 As New MenuItem
        TEST_SubMenu2.Text = "TEST2"

        TEST_Menu1.MenuItems.Add(TEST_SubMenu1)
        TEST_Menu1.MenuItems.Add(TEST_SubMenu2)

    End Sub


ちなみに、サブメニューを使わずにコンテキストメニューに再構築する場合は問題ありません。
たま、サブメニューを追加するメニューが1つの場合でも問題ありません。

わかられる方、アドバイスをお願いします。

VB.NET2003
Windows2000Pro SP4
Jubei
ぬし
会議室デビュー日: 2002/03/02
投稿数: 830
お住まい・勤務地: 関西
投稿日時: 2005-04-04 12:15
TreeViewのノード階層に合わせたサブメニュー構成をコンテキストメニューのPopupイベント毎に構築してみましたが問題ありませんでした。

コード:

--編集--AddMenu()メソッドがおかしかったのでなおしました(^^;

private void AddMenu(TreeNode ANode,MenuItem AMenu)
{
foreach(TreeNode n in ANode.Nodes)
{
MenuItem m = AMenu.MenuItems.Add(n.Text);
if (n.Nodes.Count > 0) AddMenu(n,m);
}
}

private void contextMenu1_Popup(object sender, System.EventArgs e)
{
ContextMenu cm = sender as ContextMenu;
if (cm != null)
{
cm.MenuItems.Clear();
TreeNode node = treeView1.SelectedNode;
if (node != null)
{
MenuItem mi = new MenuItem(node.Text);
AddMenu(node,mi);
cm.MenuItems.Add(mi);
}
}
}

private void AddNode(TreeNode ANode,string APath)
{
foreach(string dir in System.IO.Directory.GetDirectories(APath))
{
if(System.IO.Directory.GetDirectories(dir).Length > 0)
{
TreeNode node = ANode.Nodes.Add(System.IO.Path.GetFileName(dir));
AddNode(node,dir);
}

foreach(string file in System.IO.Directory.GetFiles(dir))
{
ANode.Nodes.Add(System.IO.Path.GetFileName(file));
}
}
}

private void Form1_Load(object sender, System.EventArgs e)
{
treeView1.Nodes.Clear();
string rootStr = @"C:\\"; //ここは適当に変えてください
TreeNode root = treeView1.Nodes.Add(rootStr);
AddNode(root,rootStr);
root.ExpandAll();
treeView1.SelectedNode = root;
}




_________________
諸農和岳
Powered by Borland Delphi/C++Builder & Microsoft VS.NET

[ メッセージ編集済み 編集者: Jubei 編集日時 2005-04-04 12:33 ]
Jubei
ぬし
会議室デビュー日: 2002/03/02
投稿数: 830
お住まい・勤務地: 関西
投稿日時: 2005-04-04 12:23
すいません、見落としていました。

引用:

たま、サブメニューを追加するメニューが1つの場合でも問題ありません。



以下のように変更しても大丈夫でした。

コード:
private void contextMenu1_Popup(object sender, System.EventArgs e)
{
    ContextMenu cm = sender as ContextMenu;
    if (cm != null)
    {
        cm.MenuItems.Clear();
        TreeNode node = treeView1.SelectedNode;
        if (node != null)
        {
            if (node.Parent != null)
            {
                foreach(TreeNode n in node.Parent.Nodes)
                {
                    MenuItem mi = new MenuItem(n.Text);
                    AddMenu(n,mi);
                    cm.MenuItems.Add(mi);
                }
            }
        }
    }
}




_________________
諸農和岳
Powered by Turbo Delphi & Microsoft Visual Studio 2005

十兵衛@わんくま同盟
http://blogs.wankuma.com/jubei/
HIRO
常連さん
会議室デビュー日: 2004/10/28
投稿数: 41
投稿日時: 2005-04-04 13:08
Jubeiさん回答ありがとうございます。
ちょっと試してみたのですが、TreeViewコントロールのContextMenuプロパティにコンテキス
トメニューを設定したときは大丈夫のようです。
TreeViewコントロールのContextMenuプロパティを使用せずに、作成したContextMenuのShow
メソッドで表示させたときが、2回目以降がNGでした。
1

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