C#复选框

C#复选框,c#,C#,我在总共8行的每行中有3个复选框。我只想在前两个复选框未选中时选中每行中的第三个复选框。我不想为每一行编写checkRow()方法 最好的办法是什么 private void checkRow() { for (int i = 0; i < 8; i++) { var arraylist = new[] { checkbox1, checkbox2, checkbox3 }; if (checkbox1.Checked || checkbox

我在总共8行的每行中有3个复选框。我只想在前两个复选框未选中时选中每行中的第三个复选框。我不想为每一行编写checkRow()方法

最好的办法是什么

private void checkRow()
{
    for (int i = 0; i < 8; i++)
    {
        var arraylist = new[] { checkbox1, checkbox2, checkbox3 };
        if (checkbox1.Checked || checkbox2.Checked)
        {
            arraylist[2].Checked = false;
        }
        else
            arraylist[2].Checked = true;
    }
}


private void checbox1_CheckedChanged(object sender, EventArgs e)
{
    checkRow();
}

private void checbox2_CheckedChanged(object sender, EventArgs e)
{
    checkRow();
}

private void checbox3_CheckedChanged(object sender, EventArgs e)
{
    checkRow();
}
private void checkRow()
{
对于(int i=0;i<8;i++)
{
var arraylist=new[]{checkbox1,checkbox2,checkbox3};
如果(复选框1.Checked | |复选框2.Checked)
{
arraylist[2]。选中=false;
}
其他的
arraylist[2]。选中=true;
}
}
私有void checbox1\u CheckedChanged(对象发送方,事件参数e)
{
checkRow();
}
私有void checbox2\u CheckedChanged(对象发送方,事件参数e)
{
checkRow();
}
私有void checbox3\u CheckedChanged(对象发送方,事件参数e)
{
checkRow();
}
作为回应

private void checkRow()
{
    var arraylist = new[] { checkEdit1, checkEdit2, checkEdit3 };
    var arraylist1 = new[] { checkEdit4, checkEdit5, checkEdit6 };
    var arraylist2 = new[] { checkEdit7, checkEdit8, checkEdit9 };
    var array = new[] { arraylist, arraylist1, arraylist2 };

    for (int i = 0; i < 8; i++)
    {
        //if checkedit1 or checkedit2 is checked the checkedit3 should not be checked
        if (array[i]....Checked || array[i]....Checked)
        {
            arraylist[i]...Checked = false;
        }
        else
            arraylist[i]...Checked = true;
    }
}
private void checkRow()
{
var arraylist=new[]{checkEdit1,checkEdit2,checkEdit3};
var arraylist1=new[]{checkEdit4,checkEdit5,checkEdit6};
var arraylist2=new[]{checkEdit7,checkEdit8,checkEdit9};
var array=new[]{arraylist,arraylist1,arraylist2};
对于(int i=0;i<8;i++)
{
//如果选中了checkedit1或checkedit2,则不应选中checkedit3
if(数组[i]…已选中| |数组[i]…已选中)
{
arraylist[i]…选中=false;
}
其他的
arraylist[i]…选中=真;
}
}

我正在尝试这样做,这样我就不必为每一行编写checkRow()

您应该使用与所有三个委托的处理程序相同的方法

chkbox.CheckedChanged += new EventHandler(chkbox_CheckedChanged);
chkbox2.CheckedChanged += new EventHandler(chkbox_CheckedChanged);
chkbox3.CheckedChanged += new EventHandler(chkbox_CheckedChanged);

private void chkbox_CheckedChanged(object sender, EventArgs e)
{
    // do your stuff here
}

对于所有三个委托,应使用与处理程序相同的方法

chkbox.CheckedChanged += new EventHandler(chkbox_CheckedChanged);
chkbox2.CheckedChanged += new EventHandler(chkbox_CheckedChanged);
chkbox3.CheckedChanged += new EventHandler(chkbox_CheckedChanged);

private void chkbox_CheckedChanged(object sender, EventArgs e)
{
    // do your stuff here
}

假设您没有使用
DataGridView
或其他方式将它们组织成逻辑行,为什么不执行以下操作:

将复选框存储在一个数组中,以便轻松访问它们

  CheckBox[,] checkArray = new CheckBox[8,3]...
将行索引存储在第一个和第二个复选框的
标记
属性中

  checkBox01.Tag = 0;
  checkBox02.Tag = 0;
  checkBox11.Tag = 1;
  checkBox12.Tag = 1;
让所有第一个和第二个复选框指向同一个事件处理程序:

  checkBox01.CheckedChanged += new EventHandler(aCheckBox_CheckedChanged);
  checkBox02.CheckedChanged += new EventHandler(aCheckBox_CheckedChanged);
  checkBox11.CheckedChanged += new EventHandler(aCheckBox_CheckedChanged);
  checkBox12.CheckedChanged += new EventHandler(aCheckBox_CheckedChanged);
在事件处理程序中,您现在确切地知道要更新哪个复选框,并且不再需要循环:

  private void aCheckBox_CheckedChanged(object sender, EventArgs e)
  {
      int rowIndex = (int)((CheckBox)sender).Tag;
      checkArray[rowIndex,2].Checked = !(checkArray[rowIndex,0].Checked || 
                                         checkArray[rowIndex,1].Checked);
  }      

您也可以使用带有复选框名称的字符串查找来实现这一点,但是如果您选择重命名复选框,则查找速度肯定会较慢,并且以后重构时会很痛苦。

假设您没有使用
DataGridView
或其他方式将其组织到逻辑行中,为什么不执行以下操作:

  checkBox01.Tag = 0;
  checkBox02.Tag = 0;
  checkBox11.Tag = 1;
  checkBox12.Tag = 1;
将复选框存储在一个数组中,以便轻松访问它们

  CheckBox[,] checkArray = new CheckBox[8,3]...
将行索引存储在第一个和第二个复选框的
标记
属性中

  checkBox01.Tag = 0;
  checkBox02.Tag = 0;
  checkBox11.Tag = 1;
  checkBox12.Tag = 1;
让所有第一个和第二个复选框指向同一个事件处理程序:

  checkBox01.CheckedChanged += new EventHandler(aCheckBox_CheckedChanged);
  checkBox02.CheckedChanged += new EventHandler(aCheckBox_CheckedChanged);
  checkBox11.CheckedChanged += new EventHandler(aCheckBox_CheckedChanged);
  checkBox12.CheckedChanged += new EventHandler(aCheckBox_CheckedChanged);
在事件处理程序中,您现在确切地知道要更新哪个复选框,并且不再需要循环:

  private void aCheckBox_CheckedChanged(object sender, EventArgs e)
  {
      int rowIndex = (int)((CheckBox)sender).Tag;
      checkArray[rowIndex,2].Checked = !(checkArray[rowIndex,0].Checked || 
                                         checkArray[rowIndex,1].Checked);
  }      

您也可以使用带有复选框名称的字符串查找来完成此操作,但如果您选择重命名复选框,则肯定会比较慢,而且以后重构会很痛苦。

您知道,您的for循环中没有使用i…是的,我想这正是您想要的。您知道,您的for循环中没有使用i…是的,我想这就是你的意思。
  checkBox01.Tag = 0;
  checkBox02.Tag = 0;
  checkBox11.Tag = 1;
  checkBox12.Tag = 1;