2016-02-03 3 views
2

Я новичок в C#, и я использую окна.Как я могу показать один пользовательский элемент управления и скрыть остальные в C#

У меня есть Form1 с 20 buttons и 20 user controls. То, что я пытаюсь сделать, это:

Когда я нажимаю button1user control1 показывает, и остальная часть user controls шкурой, нажмите button2user control2 показывает, и остальная часть user controls шкурой, нажмите button3user control3 показывает, и остальная часть user controls прятки скоро. Я могу использовать UserControl.visible = True, чтобы показать один user control и скрыть остальные, установив остальную часть user controls visibility = False, но я не хочу писать слишком много кода.

Так вместо этого я использовал следующий простой код, чтобы показать только один user control в то время, когда соответствующая button щелкают и скрыть остальные user controls, но этот код не работает он работает без ошибок, но user controls до сих пор видны.

Кто-нибудь знает, почему этот код не показывал one user control и скрыл остальные? Я буду рад услышать и другие идеи. Спасибо

private void button1_Click(object sender, EventArgs e) 
{ 
    foreach (Control ctrl in this.Controls) 
    { 
     if (ctrl .GetType() == typeof(UserControl)) 
     { 
      ctrl .Visible = false; 
     } 
    } 
    UserControl1.visible = True; 
} 
+0

Возможно, потому что это вложенный элемент управления. В настоящее время ваша петля проходит только через верхние элементы управления. Если один 'control.Controls' не пуст, эти дочерние элементы управления игнорируются. Вы можете использовать метод повторного использования. Вы использовали отладчик? Выполняется ли 'ctrl .Visible = false' вообще? –

+0

Вместо ctrl .Visible = false; возможно ctrl .IsVisible = false; – Jamaxack

ответ

5

Причина ваш код не работает, как ожидается, это условие:

if (ctrl.GetType() == typeof(UserControl)) 

GetType() возвращает фактический тип, который никогда не будет UserControl, но некоторые производные от него.

Используйте следующие вместо

if (ctrl is UserControl) 
3

Button имеет свойство Tag. Сохраните UserControl ссылки в теге собственности для всех кнопок:

button1.Tag = UserControl1; 
button2.Tag = UserControl2; 
button3.Tag = UserControl3; 
//and so on... 
//you can do it FormLoad event handler 

Теперь подписаться все кнопки на одном Click событие:

button1.Click += button1_Click; //I am using "button1_Click" for all buttons 
button2.Click += button1_Click; 
button3.Click += button1_Click; 

Теперь главное здесь:

private void button1_Click(object sender, EventArgs e) 
{ 
    Button btn = sender as Button; //cast the sender 

    //hide all user controls 
    foreach (Control ctrl in this.Controls) 
    { 
     if (ctrl .GetType() == typeof(UserControl)) 
     { 
      ctrl .Visible = false; 
     } 
    } 

    //show the usercontrol saved in "Tag" of the current button 
    (btn.Tag as UserControl).Visible = True; 
} 

Примечание : Я не скомпилировал этот код, если вы получите какую-либо ошибку. Пожалуйста, дайте мне знать.

+0

Или вы можете просто пометить кнопки и пользовательские элементы управления числом (1, 2, 3, ...) и скрыть все пользовательские элементы управления, кроме одного с соответствующим тегом ('userControl.Tag == (отправитель как кнопка) .Tag'). – CompuChip

+0

Да, это может сработать. Но главное было использовать один обработчик событий для всех кнопок. – Shaharyar

2

Этот код работал лакомство для меня:

var pairs = new[] 
    { 
     new { Button = button1, UserControl = userControl1 }, 
     new { Button = button2, UserControl = userControl2 }, 
     new { Button = button3, UserControl = userControl3 }, 
     new { Button = button4, UserControl = userControl4 }, 
     new { Button = button5, UserControl = userControl5 }, 
     new { Button = button6, UserControl = userControl6 }, 
     new { Button = button7, UserControl = userControl7 }, 
     new { Button = button8, UserControl = userControl8 }, 
     new { Button = button9, UserControl = userControl9 }, 
     new { Button = button10, UserControl = userControl10 }, 
     new { Button = button11, UserControl = userControl11 }, 
     new { Button = button12, UserControl = userControl12 }, 
     new { Button = button13, UserControl = userControl13 }, 
     new { Button = button14, UserControl = userControl14 }, 
     new { Button = button15, UserControl = userControl15 }, 
     new { Button = button16, UserControl = userControl16 }, 
     new { Button = button17, UserControl = userControl17 }, 
     new { Button = button18, UserControl = userControl18 }, 
     new { Button = button19, UserControl = userControl19 }, 
     new { Button = button20, UserControl = userControl20 }, 
    }; 

    foreach (var pair in pairs) 
    { 
     pair.UserControl.Visible = false; 
     pair.Button.Click += (s, e2) => 
     { 
      foreach (var pair2 in pairs) { pair2.UserControl.Visible = false; } 
      pair.UserControl.Visible = true; 
     }; 
    } 

Я целенаправленно создать список пар/кнопка управления пользователя, так что они жестко закодированы, и я не нужно искать их по имени. Это лучше для рефакторинга и проверки вашего кода.

Затем первый цикл foreach просто соединяет событие щелчка, которое делает все пользовательские элементы управления невидимыми, за исключением парного пользовательского элемента управления.

Просто введите этот код в свой обработчик событий .

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