2016-01-18 3 views
0

У меня есть contextMenuStrip, который генерировал данные динамической формы в базе данных. Данные в базе данных имеют столбец группы, и я хочу использовать его для динамического создания подменю для приложения. Моя проблема в том, что он создает дубликаты элементов подменю, и я хочу, чтобы они были сгруппированы.C# Создание ContextMenuStrip Sub Меню и элементы Динамически

это мой список и конструктор.

List<Tuple<WebLinks>> WebLinksList = new List<Tuple<WebLinks>>(); 

class WebLinks 
{ 
    public string Name { get; set; } 
    public string Link { get; set; } 
    public string Group { get; set; } 
} 

До сих пор это рабочий код, чтобы создать контекстное меню, но мне это нужно, чтобы изменить мнение группы, а не просто показать имя.

private void CreateMenu() 
{ 

    foreach (Tuple<WebLinks> wl in WebLinksList) 
    { 
     contextMenuStripMain.Items.Add(wl.Item1.Name); 
    } 
    contextMenuStripMain.Items.Add("-"); 
    contextMenuStripMain.Items.Add("Settings"); 
    contextMenuStripMain.Items.Add("Exit"); 
} 

выше работает нормально, но ничего не группируется, поэтому мне нужно работать в «wl.Item1.Group» где-нибудь, но Google не было никакой помощи в моей ситуации.

Я устал This Stack Overflow, и он дал мне дубликаты групп, где я пытался отфильтровать его, но не повезло. Надеюсь, у меня есть смысл.

ответ

0

Вы можете использовать LINQ группировать объекты:

private void CreateMenu() 
{ 
    foreach (var group in WebLinksList.GroupBy(wl => wl.Item1.Group)) 
    { 
     var groupItem = new ToolStripMenuItem(group.Key); 
     contextMenuStripMain.Items.Add(groupItem); 
     groupItem.DropDownItems.AddRange(group.Select(w => new ToolStripMenuItem(w.Item1.Name)).ToArray<ToolStripItem>()); 
    } 

    contextMenuStripMain.Items.Add("-"); 
    contextMenuStripMain.Items.Add("Settings"); 
    contextMenuStripMain.Items.Add("Exit"); 
} 

Таким образом, для каждого отдельного Group будет добавлен один пункт меню. К этому элементу подпункты этой группы добавляются Name.

[EDIT] Теперь я создаю groupItem как ToolStripMenuItem и добавляю подпозиции в категорию DropDownItems.

+0

Большое спасибо, я вижу, что вы здесь делаете, но по какой-то причине «groupItem.Items.AddRange» дает ошибки, ToolStripItem не содержит определения для «Items» и не имеет метода расширения «Items». – Psystec

+0

@Psystec Да, была ошибка. 'Items.Add' возвращает абстрактный' ToolStripItem', который не знает о подпозициях. Элемент 'ToolStripMenuItem' имеет подпункты, но с именем' DropDownItems' вместо 'Items'. Обновлен мой ответ. –

+0

Спасибо, человек, ты лучший. он работает как шарм, я вижу, что вам нужно событие click для подменю. – Psystec

0

Thanks René Vogt. Я исправил, если до того, как я прочитал ваш ответ, но решил пойти с вами в любом случае.

Это было ваше исправление, я просто добавил событие щелчка для подменю.

 foreach (var group in WebLinksList.GroupBy(wl => wl.Level)) 
     { 
      var groupItem = new ToolStripMenuItem(group.Key); 
      contextMenuStripMain.Items.Add(groupItem); 
      groupItem.DropDownItemClicked += Tm_DropDownItemClicked; 
      groupItem.DropDownItems.AddRange(group.Select(w => new ToolStripMenuItem(w.Name)).ToArray<ToolStripItem>()); 
     } 

Это был мой Fix, но это то же самое.

 foreach (var group in WebLinksList.GroupBy(wl => wl.Level)) 
     { 
      ToolStripMenuItem tm = new ToolStripMenuItem(); 
      tm.Text = group.Key; 
      tm.DropDownItemClicked += Tm_DropDownItemClicked; 
      tm.DropDownItems.AddRange(group.Select(w => new ToolStripMenuItem(w.Name)).ToArray<ToolStripItem>()); 
      contextMenuStripMain.Items.Add(tm); 
     } 

В любом случае, я бы не сделал это без вас. Спасибо

+0

Я забыл сказать, что я удалил Tuple в списке, поскольку он не был нужен, потому что у меня есть класс, который будет обрабатывать это. – Psystec