@ikari81

Как повторить структуру treeview в menu?

Есть заполненный treeview, нужно повторить его структуру в меню. Пока сделал обход treeview, а вот как восстановить его структуру в меню никак понять не могу. Может кто сталкивался, направьте меня, куда копать?

0e0fa5f2cfc74272adc152b8431caf05.jpg
  • Вопрос задан
  • 2346 просмотров
Пригласить эксперта
Ответы на вопрос 2
AlekseyNemiro
@AlekseyNemiro
full-stack developer
Рекурсия:
private void button1_Click(object sender, EventArgs e)
{
  // создаем меню
  var menu = new MenuStrip();
  menu.Items.Add("Меню");

  // перебираем узлы
  foreach (TreeNode n in treeView1.Nodes)
  {
    // создаем элемент меню
    var menuItem = new ToolStripMenuItem();
    menuItem.Text = n.Text;
    // перебирем детей
    ConvertNodeToMenu(menuItem, n);
    // добавляем элемент в меню
    ((ToolStripMenuItem)menu.Items[0]).DropDownItems.Add(menuItem);
  }
      
  // добавляем меню на форму
  this.Controls.Add(menu);
}

private void ConvertNodeToMenu(ToolStripMenuItem menuParent, TreeNode node)
{
  foreach (TreeNode n in node.Nodes)
  {
    // создаем элемент меню
    var menuItem = new ToolStripMenuItem();
    menuItem.Text = n.Text;
    // перебираем детей
    ConvertNodeToMenu(menuItem, n);
    // добавляем элемент в меню
    menuParent.DropDownItems.Add(menuItem);
  }
}

Вариант с LINQ:
private void button1_Click(object sender, EventArgs e)
{
  // создаем меню
  var menu = new MenuStrip();
  menu.Items.Add("Меню");
  // берем первый элемент меню
  var menuItem = (ToolStripMenuItem)menu.Items[0];
  // получаем узлы и добавляем в меню
  menuItem.DropDownItems.AddRange
  (
    treeView1.Nodes.Cast<TreeNode>().Select
    (
      n => new ToolStripMenuItem(n.Text, null, ConvertNodeToMenu(n))
    ).ToArray()
  );
  // добавляем меню на форму
  this.Controls.Add(menu);
}

private ToolStripMenuItem[] ConvertNodeToMenu(TreeNode node)
{
  return node.Nodes.Cast<TreeNode>().Select
  (
    n => new ToolStripMenuItem(n.Text, null, ConvertNodeToMenu(n))
  ).ToArray();
}
Ответ написан
Neuroware
@Neuroware
Программист в свободное от работы время
советую глянуть здесь. По ссылке и исходник лежит со схожим функционалом.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы