2016-11-22 49 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