2016-11-22 47 views
0

所以我有一個鼓機隨機按鈕隨機填充每個複選框。我不想同時玩2個鼓。有16個節拍,總共5個鼓。所以我想用一個for循環,檢查在列表中的當前值,然後將複選框布爾爲false值加上或減去16省略複選框的選擇

例如:如果選擇複選框1,複選框17,33 ,49和65應該是空的。同樣,如果選中複選框56,則應該取消選中8,24,40和72。每個複選框都應該一樣。我不知道如何做到這一點。

This is my form it will help display my intent

這裏是代碼隨機填充複選框:

private void randombuttonClick(object sender, EventArgs e) 
     { 
      List<CheckBox> Checkboxlist = new List<CheckBox>(); 
      foreach (CheckBox control in this.Controls.OfType<CheckBox>()) 
      { 
       Checkboxlist.Add(control); 
       control.Checked = false; 
      } 

      for (int i = 0; i <= 50; i++) 
      { 
       var r = random.Next(0, Checkboxlist.Count); 
       var checkbox = Checkboxlist[r]; 
       Checkboxlist[r].Checked = true; 
      } 
     } 

爲尋找謝謝!

+0

我想你必須要更具體一點,它有點不清楚*爲什麼這個*和*爲什麼那個* ...你在這個項目上工作,讓它可視化,在紙上或思想上的以太,我們不會「T。 – Jim

+0

當複選框1被選中時,你想要取消選中17,33,49和56.他們之間怎麼樣像18,19,20等等和34,35等等? – Aruna

+0

這聽起來像你應該使用單選按鈕... –

回答

0

首先 - 您可能想按某種方式排列複選框列表。如果你有正確設置tabIndex屬性,你可以這樣做:

foreach (CheckBox control in this.Controls.OfType<CheckBox>().OrderBy(x => x.TabIndex)) 
{ 
    //... 
} 

其次,最簡單的解決方案可能是通過列迭代,選擇一個隨機鼓打。

List<CheckBox> checkboxList = this.Controls.OfType<CheckBox>() 
    .OrderBy(x => x.TabIndex) 
    .ToList(); //it's simpler than a foreach loop 
for (int i = 0; i < 16; i++) 
{ 
    var instrumentIndex = random.Next(0, 4); //make it (0, 5) if you want to allow an entirely empty column 
    for (int j = 0; j < 4; j++) 
    { 
     checkboxList[j*16 + i] = (j == instrumentIndex); 
    } 
} 

代碼遍歷使用i變量來存儲當前列號的列。對於每一列,它會從四個中隨機選擇一行(如評論所說,如果您希望「當前節拍中沒有樂器」作爲選項,只需擴展隨機範圍以包含4,這將不匹配任何行)。

然後,對於在該列中的每個複選框(開始用i個複選框,這是在第一行中,並在i列,和移動每個時間,這向下移動中的一行16個複選框),它分配true當行號與隨機選擇的行號匹配時,否則返回false

+1

非常感謝!巨大的幫助。感謝您的深入解釋! – murderface