56323


お世話になります。

CSVのテキストを読み込み、自動的にContextMenuStripを生成するコードを書いています。  
一つルート階層のToolStripMenuItemを準備してから、ツリー構造を作るような  
アルゴリズムにしました。

最後に、いざContextMenuStripに乗せるときに、rootをそのまま乗せると、root自体が  
邪魔に感じてしまうので、rootの子供からContextMenuStripに乗せようとするのですが、  
例外が発生して思うように動きません。

原因と対策をお教えいただけますでしょうか。

下記にコードを記述します。

[code]

    private void BaseForm_Load(object sender, EventArgs e)
    {
        // cmsはContextMenuStrip
    
        string[] stItems =　File.ReadAllLines(@"C:\xxxxxxx\売り物.txt");
    
        if(stItems == null)
        {
            return;
        }
    
        this.cms.Items.Clear();
    
        ToolStripMenuItem root = new ToolStripMenuItem();
        foreach (string s in stItems)
        {
            string[] values = s.Split(',');
            ToolStripMenuItem parent = root;
    
            foreach (string ss in values)
            {
                if (ss != "")
                {
                    ToolStripMenuItem mi = new ToolStripMenuItem();
                    mi.Text = ss;
                    parent.DropDownItems.Add(mi);
                    parent = mi;
                }
                else
                {
                    parent = (ToolStripMenuItem)parent.DropDownItems[root.DropDownItems.Count - 1];
                }
            }
        }
    
    　　　　　　　//　コレクションごとごっそり入れようとしてもエラー
        this.cms.Items.AddRange(root.DropDownItems);
    
    　　　　　　//　一つ一つ取り出して入れようとしても違ったエラー　
        foreach (ToolStripMenuItem tsmi in root.DropDownItems)
        {
            this.cms.Items.Add(tsmi);
        }
    }
    
[/code]

[![画像の説明をここに入力](https://i.stack.imgur.com/aRREo.jpg)](https://i.stack.imgur.com/aRREo.jpg)  
CSVの中身は↓

くだもの,りんご  
,いちご  
,みかん  
,スイカ  
野菜,キャベツ  
,きゅうり  
,大根  
,玉ねぎ

以上、よろしくお願いいたします。


CC BY-SA 4.0
2019-07-02T07:15:00.010
56315
2019-07-02T10:52:32.807
2019-07-02T08:27:31.137
9374
9374
question
c# form
C# 階層の出来上がっているToolStripMenuItemから一段階下の階層を得るときにエラーになる


`root.DropDownItems`の型`ToolStripItemCollection`と、`ContextMenuStrip.Items.AddRange()`のパラメータの型`ToolStripItem[]`が違うためでしょう。

以下のようにいったん変換すれば設定できるのでは？

[code]

    ToolStripItem[] menuItems = new ToolStripItem[root.DropDownItems.Count];
    root.DropDownItems.CopyTo(menuItems, 0);
    
    this.cms.Items.AddRange(menuItems);
    
[/code]


CC BY-SA 4.0
2019-07-02T10:52:32.807
56323
2019-07-02T10:52:32.807
26370
56315
answer