C#Windows窗体datagridview复选框互锁

时间:2014-10-13 07:24:41

标签: c# winforms checkbox datagridview

我写了一个C#Windows Form程序,我想要的效果如下。 当用户单击All复选框时,将检查该行的所有复选框。另一方面,如果用户再次单击All复选框,则将取消选中该行的所有复选框。此外,如果用户取消选中任何复选框(独占All复选框),则必须取消选中All复选框。但是,当任何框的值发生更改时,将调用CellValueChanged。这很难处理。并且,我总是通过我的代码获得无限循环。任何人都可以解决它吗?非常感谢!!
enter image description here

    private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
    {
        dataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit);
    }

    private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
    {
        if (e.ColumnIndex == 1 && e.RowIndex >= 0)
        {
            if (Convert.ToBoolean(dataGridView1.Rows[e.RowIndex].Cells[1].Value))
            {
                //check all the Checkboxs 
                for (int i = 2; i < 26; i++)
                    dataGridView1.Rows[e.RowIndex].Cells[i].Value = true;

                //if the other row all checked, unchecked it all
                for(int i = 0; i < dataGridView1.Rows.Count; i++)
                {
                    if (i == e.RowIndex)
                        continue;

                    if(Convert.ToBoolean(dataGridView1.Rows[i].Cells[1].Value))
                    {
                        for(int j = 1; j < dataGridView1.Rows[i].Cells.Count; j++)
                        {
                            dataGridView1.Rows[i].Cells[j].Value = false;
                        }
                    }
                }
            }
            else
                for (int i = 2; i < 26; i++)
                    dataGridView1.Rows[e.RowIndex].Cells[i].Value = false;
        }
        else if(e.ColumnIndex > 1 && e.RowIndex >= 0)
        {
                bool flag = true;
                for (int i = 2; i < dataGridView1.Rows[e.RowIndex].Cells.Count; i++)
                {
                    if (!Convert.ToBoolean(dataGridView1.Rows[e.RowIndex].Cells[i].Value))
                        flag = false;
                }

                if (flag)
                    dataGridView1.Rows[e.RowIndex].Cells[1].Value = false;
                else
                    dataGridView1.Rows[e.RowIndex].Cells[1].Value = true;
        }

    }


1 个答案:

答案 0 :(得分:2)

无限循环的问题是dataGridView1_CellValueChanged每次调用它自己。

我建议将lock(object)添加到dataGridView1_CellValueChanged,在这种情况下,检查所有行是否全部检查的调用都不会被调用,直到所有复选框都标记为已选中。