C# 階層の出来上がっているToolStripMenuItemから一段階下の階層を得るときにエラーになる

投稿者: Anonymous

お世話になります。

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

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

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

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

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);
    }
}

画像の説明をここに入力
CSVの中身は↓

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

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

解決

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

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

ToolStripItem[] menuItems = new ToolStripItem[root.DropDownItems.Count];
root.DropDownItems.CopyTo(menuItems, 0);

this.cms.Items.AddRange(menuItems);
回答者: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *