2009-10-12 3 views
1

Мне было интересно, может ли SO помочь упростить некоторую логику. У меня есть форма Windows (C# 2.0), которая содержит System.Windows.Forms.MenuStrip.C# Динамически добавлять ToolStripMenueItems в MenuStrip

  1. Я хочу, чтобы динамически добавлять ToolStripMenueItems к MenuStrip. Добавленные элементы будут сбиты с базы данных (но для простота я удалил ту часть из кода ниже).
  2. Я хотел бы иметь возможность строить сложные меню (т.е. инструменты> Math> Calc, Помощь> Документы, справки> О, Формат> Кодировка> Западная, Формат> Кодировка> Другое> Греческий).

Код, как представляется, работает, но что бы вы сделали, чтобы сделать loadToolbars() более эффективным/проще?

Это функция мне нужна помощь с:

void loadToolbars() 
{ 
    foreach(Toolbar t in getToolStripItems()) 
    { 
     string[] toolPath = t.toolbar.Split(">".ToCharArray(),StringSplitOptions.RemoveEmptyEntries); 
     ToolStripMenuItem root = null; 
     ToolStripItem[] foundItems; 

     /* 
     * follow the path of each Toolbar item. If we find a dead-end, 
     * add the missing part 
     */ 
     for(int i=0; i<toolPath.Length; i++) 
     { 
      if(root == null) 
      { 
       //Search the main menu strip (System.Windows.Forms.MenuStrip) 
       foundItems = DA_Menu.Items.Find(toolPath[i],false); 
      }else 
      { 
       //Continue searching were we left off 
       foundItems = root.DropDownItems.Find(toolPath[i],false); 
      } 

      if(foundItems.Length>0) 
      { 
       foreach(ToolStripItem item in foundItems) 
       { 
        //Is this the Toolbar item I am looking for? 
        if(item.Text == toolPath[i]) 
        { 
         if(item.OwnerItem != null && i>0) 
         { 
          if((item.OwnerItem.Text == toolPath[i-1]) 
           && (item.Text == toolPath[i])) 
           root = (ToolStripMenuItem)item; 
         }else 
         { 
          root = (ToolStripMenuItem)item; 
         } 
        } 
       } 
      }else 
      { 
       //We hit a dead-end. Add the missing path 
       if(root == null) 
       { 
        root = new ToolStripMenuItem(toolPath[i]); 
        root.Name = toolPath[i]; 
        DA_Menu.Items.Add(root); 
       }else 
       { 
        ToolStripMenuItem tsmi = new ToolStripMenuItem(toolPath[i]); 
        tsmi.Name = toolPath[i]; 
        root.DropDownItems.Add(tsmi); 
        root = tsmi; 
       } 
      } 
     } 

     //Add the Toobar item to the path that was built above 
     t.Click +=new EventHandler(Toolbar_Click); 
     ((ToolStripMenuItem)root).DropDownItems.Add(t); 
    } 
} 

Everthing ниже, я доволен, но я обеспечиваю его, чтобы помочь другим следовать тому, что я делаю.

Эта функция управляется данными, но жестко закодированы в пользу SO

private List<Toolbar> getToolStripItems() 
{ 
    List<Toolbar>toolbars = new List<Toolbar>(); 

    Toolbar t = new Toolbar(); 
    t.Text = "Calc"; 
    t.path = "c:\windows\system32\calc.exe"; 
    t.toolbar = "Tools>Microsoft>Math"; 

    toolbars.Add(t); 

    t = new Toolbar() 
    t.Text = "Calc2"; 
    t.path = "c:\windows\system32\calc.exe"; 
    t.toolbar = "Tools>Math>Microsoft"; 

    toolbars.Add(t); 

    return toolbars; 
} 

пользовательского класса, чтобы помочь сохранить свои кликах события просто

class Toolbar:ToolStripMenuItem 
{ 
    public string path; 
    public string toolbar; 
    public Toolbar() 
    { 
     /* 
     * Set the name to the Text value 
     * so that it can be found in collection 
     * by key 
     */ 
     base.Name = Text; 
    } 
} 

Все панели инструментов нажмём события будут обрабатываться в этом функция

void Toolbar_Click(object sender, EventArgs e) 
{ 
    //Get the Toolbar item that was clicked 
    Toolbar t = (Toolbar)sender; 

    //Start new process 
    System.Diagnostics.Process p = new System.Diagnostics.Process(); 
    p.StartInfo.FileName = t.path; 
    p.Start(); 
} 

ответ

1

Проблема заключается в форме, в которой находятся ваши данные. Если вы придерживаетесь t Форма шляпы Я не думаю, что есть много дел.

В противном случае измените данные из плоской структуры поля, например «Инструменты> Microsoft> Math», на что-то вроде TreeList, например. список инструментов, включающий список Microsoft, включая список Math, включая записи вашего приложения. Вы даже можете создать эту структуру в базе данных.

Затем вы можете легко добавить элементы меню рекурсивно.

+0

Благодарим Вас за отзыв. Это неплохая идея. Я могу подумать об использовании файла конфигурации xml для создания подобной структуре списка и сбрасывания базы данных вместе ... Я буду играть с ней и посмотреть, как мне нравится. Дал вам +1 для быстрого ответа. –

Смежные вопросы