2017-02-21 11 views
3

我正在開發一個學校的應用程序,您可以在這個應用程序中將遊戲添加到稍後顯示在屏幕上的信息列表中。我將如何循環顯示錶單中的所有複選框?

在表格中,有8個複選框,每個複選框代表一個控制檯。您可以檢查遊戲可用的控制檯。

因此,我想獲得一個包含8個不同值的布爾值數組,每個控制檯一個布爾值。

我相信我的代碼不緊湊,應該有更好的解決方案。有沒有一種方法可以循環使用代碼而不是爲每個複選框編寫代碼?

這是目前我所擁有的。

private void button1_Click(object sender, EventArgs e) 
{ 
    bool[] platforms = new bool[8] { false, false, false, false, false, false, false, false }; 
    if (checkBox1.Checked) 
    { 
     platforms[0] = true; 
    } 
    if (checkBox2.Checked) 
    { 
     platforms[1] = true; 
    } 
    if (checkBox3.Checked) 
    { 
     platforms[2] = true; 
    } 
    if (checkBox4.Checked) 
    { 
     platforms[3] = true; 
    } 
    if (checkBox5.Checked) 
    { 
     platforms[4] = true; 
    } 
    if (checkBox6.Checked) 
    { 
     platforms[5] = true; 
    } 
    if (checkBox7.Checked) 
    { 
     platforms[6] = true; 
    } 
    if (checkBox8.Checked) 
    { 
     platforms[7] = true; 
    } 
} 
+0

你熟悉Lambda表達式..我會考慮類似的東西..或使用如何循環控制'控件'類..? – MethodMan

+2

您的表單應該有一個屬性'Controls',其中包含對錶單上註冊的每個控件的引用。循環播放並檢查類型(*忽略非複選框控件*)。然後,您可以獲取名稱,並根據名稱獲取最後一個字符的數字值,然後根據控件值(基於上面的邏輯)設置索引。 – Igor

+0

你的表單有'Controls'集合。迭代過濾掉CheckBox。對每個「CheckBox」都將'Tag'屬性關聯到它的語義。 – Tigran

回答

6

假設它是Windows窗體,你可以做這樣的:

int index = 0; 
foreach (Control Con in this.Controls) 
{ 
    if (Con is CheckBox) 
     platforms[index++] = ((CheckBox)Con).Checked; 
} 
+3

應該指出的是,只有當複選框是表單的直接子項時才能使用。它不會遞歸到面板,組合框或任何其他容器控件中。 – adv12

+3

此外,我建議使用'Controls.OfType ()'而不是循環遍歷所有控件並自行檢查類型。不是一個大問題,但它更緊​​湊。 – adv12

+0

謝謝@ adv12和伊戈爾,沒有太多的信息o如何放置控制器,但你們都是絕對正確的!問候! – karkazz

0

我要去一起前言本,你應該把你所有的複選框的組框或在面板內部,或某種容器控制。這樣你就知道哪些複選框被迭代了。因爲如果你添加了另一個你不想在這個列表中的複選框,並且突然改變了你的功能,是不是很愚蠢?

鑑於我所看到的,但這是我的建議。當您添加新控件時,它不會動態增長,但它只會遍歷所需的複選框。如果您將複選框放入容器中,請使用其他答案!

bool[] platforms = new bool[8] 
{ 
    checkBox1.Checked, 
    checkBox2.Checked, 
    checkBox3.Checked, 
    checkBox4.Checked, 
    checkBox4.Checked, 
    checkBox5.Checked, 
    checkBox6.Checked, 
    checkBox7.Checked 
}; 
0

我會走一步的問候什麼@ adv12的情況下,控制曾表示嵌套/內其他容器中,這是非常簡單的,我能很好地

private void SetCheckedValues() 
{ 
    Action<Control.ControlCollection> func = null; 
    func = (controls) => 
    { 
     foreach (Control control in controls) 
     { 
      if (control is CheckBox) 
      { 
       (control as CheckBox).Checked(); 
       //set your other values to True creating a counter variable outside the foreach and 
       //incrementing it inside here 
      } 
      else 
      { 
       func(control.Controls); 
      } 
     } 
    }; 
    func(Controls); 
} 
2

你可以使用this.Controls.OfType,但你需要保存它的結果在一個布爾數組,所以我覺得這個代碼對你的作品:

bool[] platforms = new bool[8] { false, false, false, false, false, false, false, false }; 

     var controls = this.Controls.OfType<CheckBox>().ToArray(); 

     for (int i = 0; i < controls.Length; i++) 
     { 
     platforms[i] = controls[i].Checked; 
     } 

如果您通常使用這種方法,您可以創建該擴展的表單如

public static class FormExtension 
    { 
    public static CheckBox[] GetCheckboxes(this Form form) 
    { 
     return form.Controls.OfType<CheckBox>().ToArray(); 
    } 
    } 

並調用一樣:

var checkboxes = this.GetCheckboxes(); 
+0

也許我錯過了一些東西,但是你做了什麼來保證'platforms [0]'將被設置爲'checkbox1.Checked'的值,'platforms [1]'將被設置爲'checkbox2的值.Checked'等等?似乎你依賴於控件出現在「控件」列表中的順序,該列表與複選框名稱沒有必要的關聯。 – adv12

+0

這個http://pastebin.com/DNhw5KvH怎麼樣 –

相關問題