【问题标题】:C# Windwos Form datagridview Checkbox InterlockingC# Windows 窗体 datagridview 复选框联锁
【发布时间】:2014-10-13 07:24:41
【问题描述】:

我写了一个C# Windows Form程序,我想要的效果如下。 当用户点击All复选框时,该行的所有复选框都会被选中。另一方面,如果用户再次单击All 复选框,则该行的所有复选框都将被取消选中。此外,如果用户取消选中任何复选框(不包括 All 复选框),则必须取消选中 All 复选框。但是,CellValueChanged 将在任何框的值更改时被调用。很难处理。而且,我的代码总是无限循环。任何人都可以修复它吗?非常感谢!!

    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;
        }

    }


【问题讨论】:

    标签: c# winforms checkbox datagridview


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-15
      • 1970-01-01
      • 2015-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多