所以我有一台带随机按钮的鼓机随机填充每个复选框。我不想同时打2鼓。共有16个节拍,共有5个鼓。所以我想考虑使用for循环来检查列表中的当前值,然后将值boolean设置为false,以获取值加上或减去16。
例如:如果选中复选框1,则复选框17,23,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 :(得分: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
变量循环遍历列以存储当前列号。对于每一列,它从四个中选择一个随机行(如评论所示,如果你想要&#34;当前节拍中没有乐器&#34;是一个选项,只需将随机范围扩展到包括4,这不会匹配任何行。)
然后,对于该列中的每个复选框(从i
复选框开始,该复选框位于第一行和i
列中,每次移动16个复选框,这些复选框完全向下移动一行),当行号与随机选择的行号匹配时,它会指定true
,否则会false
。