2015-11-06 98 views
0

我有30個列表框和30個複選框。我想要每個複選框來控制每個listbox.enabled屬性。現在,我最好的想法是創建30個不同的方法,每個對checkbox1 - listbox1,checkbox2 - listbox2等一對,但是如果我將來需要添加更多對,我認爲這不會很好地擴展。將多個複選框綁定到多個列表框屬性

有沒有更簡單的方法來做到這一點?我想到一個foreach循環遍歷表單中的每個複選框,但是我怎麼讓循環理解,如果它處理checkbox15,它應該改變listbox15的.enabled? 我很新的這讓我體會不同的建議:)

截至目前,我有這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)'你可以檢查'ctrl'如果CheckBox'從那裏檢查它是否被檢查狀態等。需要編寫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循環很容易。我也學習了關於字典,我將深入挖掘更多的瞭解。謝謝! :) – Minuzed

1

這裏有幾個可能的方法:

  • 使用綁定在列表框的Enabled屬性綁定到其複選框選中屬性。您仍然需要編寫代碼來創建所有綁定(可能有一種方法可以在視覺設計器中執行此操作)

  • 將複選框的字典設置爲listboxes,並創建一個單擊處理程序(您將提供給每個複選框),它將使用「發件人」參數來查找正確的列表框來啓用/禁用字典。

這些都涉及到代碼,就必須要記住,當你添加另一對控件進行更新,但都應該只需要爲每個新的對一個或兩個新的生產線。

1

從發件人參數中查找複選框名稱。下面找到ListBox控件相匹配的數字後綴使用:

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