2017-01-23 2 views
-4

Я должен разработать на бланке простое меню, как:Как управлять динамическим меню с помощью разделителей?

  • Файл
    • Вариант А
    • Вариант B
    • -------- (сепаратор 1)
    • Вариант C
    • Вариант D
    • -------- (разделитель 2)
    • Вариант E

Каждая запись хранится в БД и виден или нет, в зависимости от подключенных пользовательских прав

Например, пользователь «j.doe» не будет видеть параметры C и D

Мой вопрос: как это сделать, чтобы динамически избежать того, что в меню отображаются 2 разделителя, так как, очевидно, требуется только один бит betwen Варианты B и E?

+2

какие усилия вы сделали, чтобы попытаться решить эту проблему? –

+0

Я пытался хранить в bool, когда я вставляю разделитель. Затем, если следующий элемент меню также является разделителем, поэтому я его не вставляю. Но это смущает, и я спрашиваю меня, нет ли правильного или простого способа сделать это. – Austin

ответ

-1

Просто добавьте разделитель, если выполнены следующие три условия:

  1. Существует по крайней мере один пункт меню уже присутствует.
  2. Предыдущий элемент меню не является разделителем.
  3. Существует еще один пункт меню, который нужно добавить после текущего.

Это не должно быть слишком сложно. Попробуйте написать код, следуя этой спецификации, и если вы столкнулись с трудностями, придите сюда и снова спросите о более конкретных проблемах с кодированием.

UPDATE: Видя решения, предложенные здесь, которые все подобранные специально для вашего конкретного вопроса, я буду просто идти вперед и показать вам, как я бы решить общую проблему таким образом, что работает для любого меню конфигурация:

static void DynamicallySetMenuItems(MenuItem menu, UserRole role) 
{ 
    var menuItems = GetMenuItems(role); 
    var previous = menuItems.FirstOrDefault(); 

    if (previous == null) 
     return; 

    if (!IsSeparator(previous)) 
    {  
     menu.MenuItems.Add(previous); 
    } 

    foreach (var current in menuItems.Skip(1)) 
    { 
     if (!IsSeparator(current) || 
      !IsSeparator(previous)) 
     { 
      menu.MenuItems.Add(previous); 
     } 

     previous = current; 
    }   

    if (IsSeparator(previous)) 
    { 
     menu.MenuItems.Remove(previous); 
    } 
} 

static bool IsSeparator(MenuItem menu) 
    => menu.Text == "-"; 
+0

@Downvoter Нет, нет, нет, это не приятно, по крайней мере, объясните, почему downvote;) – InBetween

+0

спасибо за ваш ответ – Austin

-2

вы просто построить меню на лету, как таковой:

  var myMenu = new ContextMenuStrip(); // works also with tool strip menus, main menu, etc... 
      int m = 0; 
      if(/* has option A */) 
      { 
      myMenu.Items.Add("Option A"); 
      myMenu.Items[m++].Click += OptionA_Click; 
      } 
      if(/* has option B */) 
      { 
      myMenu.Items.Add("Option B"); 
      myMenu.Items[m++].Click += OptionB_Click; 
      } 
      if(/* has option C or D */) 
      { 
      myMenu.Items.Add(new ToolStripSeparator()); 
      m++; 
      } 
      if(/* has option C */) 
      { 
      myMenu.Items.Add("Option C"); 
      myMenu.Items[m++].Click += OptionC_Click; 
      } 
      if(/* has option D */) 
      { 
      myMenu.Items.Add("Option D"); 
      myMenu.Items[m++].Click += OptionD_Click; 
      } 
      if(/* has option E */) 
      { 
      myMenu.Items.Add(new ToolStripSeparator()); 
      myMenu.Items.Add("Option E"); 
      myMenu.Items[++m].Click += OptionE_Click; 
      } 
+0

спасибо за ваш ответ – Austin

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