2015-11-06 3 views
0

У меня есть 30 списков и 30 флажков. Я хочу, чтобы каждый флажок контролировал каждое свойство listbox.enabled. На данный момент я хотел бы создать 30 разных методов: по одной для каждой пары checkbox1 - listbox1, checkbox2 - listbox2 и т. Д., Но я не думаю, что это очень хорошо, если мне нужно добавить больше пар в будущем.Связать несколько флажков с несколькими свойствами списка

Есть ли более простой способ сделать это? Я думал о цикле foreach, который проходит через каждый флажок в форме, но затем как я могу понять, что этот цикл понимает, что если он имеет дело с checkbox15, он должен изменить .enabled из спискаbox15? Я очень новичок в этом, так что я ценю различные предложения :)

В настоящее время, у меня есть 30 из них: (а остальная часть из них меняется на checkBox2/listBox2 и т.д.)

private void checkBox1_CheckedChanged(object sender, EventArgs e) 
{ 
     if (checkBox1.Checked) 
     { 
      if (listBox1.Items.Count >= 1) 
      { 
       tillgangligaForare.Items.Add(listBox1.Items[0]); 
       listBox1.Items.Clear(); 
       uppdateraSummering(); 
      } 

      listBox1.Enabled = false; 
      listBox1.Items.Add("FORDON EJ I BRUK"); 
     } 
     else 
     { 
      listBox1.Items.Clear(); 
      listBox1.Enabled = true; 
     } 
} 
+0

Используйте привязки для привязки свойства Checked этого флажка к свойству Enabled списка. Вам все равно придется написать какой-то утомительный код, но вам не потребуется 30 обработчиков кликов. –

+0

вы знакомы с классом 'Controls' и как вы можете сделать' ForEach (Control ctrl in Controls) 'вы можете проверить, если' ctrl', если CheckBox' там проверяет, проверено ли это состояние или нет и т. Д. No нужно написать 30 разных методов. – MethodMan

ответ

0

Объединить два предложения от Lotharyx и Sasway Padhan с Load() событием в форме, что дает:

private Dictionary<CheckBox, ListBox> lookup = new Dictionary<CheckBox, ListBox>(); 

    private void Form1_Load(object sender, EventArgs e) 
    { 
     ListBox lb; 
     CheckBox cb; 

     for (int i = 1; i <= 30; i++) 
     { 
      lb = this.Controls.Find("listBox" + i.ToString(), true).FirstOrDefault() as ListBox; 
      cb = this.Controls.Find("checkBox" + i.ToString(), true).FirstOrDefault() as CheckBox; 
      if (lb != null && cb != null) 
      { 
       lookup.Add(cb, lb); 

      } 
     } 
    } 

    private void checkBoxes_CheckedChanged(object sender, EventArgs e) 
    { 
     CheckBox cb = sender as CheckBox; 
     if (lookup.ContainsKey(cb)) 
     { 
      ListBox lb = lookup[cb]; 

      if (cb.Checked) 
      { 
       if (lb.Items.Count >= 1) 
       { 
        tillgangligaForare.Items.Add(lb.Items[0]); 
        lb.Items.Clear(); 
        uppdateraSummering(); 
       } 

       lb.Enabled = false; 
       lb.Items.Add("FORDON EJ I BRUK"); 
      } 
      else 
      { 
       lb.Items.Clear(); 
       lb.Enabled = true; 
      } 
     }    
    } 
+0

Это именно то, что я искал! Один клик-обработчик, и легко добавить больше элементов управления и просто добавить к циклу for-loop. Я также узнал о Словаре, в котором я буду копать глубже, чтобы узнать больше. Благодаря! :) – Minuzed

1

Здесь есть пара возможных подходов:

  • Использование привязки для связывания Enabled собственности на ListBox проверенной собственности на его флажке. Вам все равно придется писать код для создания всех привязок (возможно, есть способ сделать это в визуальном дизайнере)

  • Сделайте словарь флажков в список и создайте обработчик с одним кликом (который вы будете дайте каждому флажку), который будет использовать аргумент «отправитель» для поиска правильного списка для включения/выключения из словаря.

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

1

Найти имя ячейки из аргумента отправителя. Использование следующее найти управление ListBox, совпадающее с номером суффиксом:

int suffix = 1; // Get from Checkbox name suffix 
ListBox tbx = this.Controls.Find("listbox" + suffix, true).FirstOrDefault() as ListBox; 
tbx.Enabled = false;