省略复选框的选择

时间:2016-11-22 22:59:21

标签: c# for-loop checkbox boolean

所以我有一台带随机按钮的鼓机随机填充每个复选框。我不想同时打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;
            }
        }

感谢您的期待!

1 个答案:

答案 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