如何处理datagridview中的combobox事件?

How to handle event of combobox in datagridview?

我有一个复选框[All]和一个数据网格视图,如下所示:

我愿意:

我试过了,但我做不到:

private void dataGridView_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
    bool isAllCheck = false;

    if (e.ColumnIndex == 0)
    {
        foreach (DataGridViewRow row in dataGridView.Rows)
        {
            DataGridViewCheckBoxCell chk = row.Cells[0] as DataGridViewCheckBoxCell;

            isAllCheck = Convert.ToBoolean(chk.Value);
            if (!isAllCheck)
            {
                break;
            }
        }

        if (chkAllItem.Checked && !isAllCheck)
        {
            chkAllItem.Checked = false;
        }

        if (!chkAllItem.Checked && isAllCheck)
        {
            chkAllItem.Checked = true;
        }
    }
}

private void dataGridView_CurrentCellDirtyStateChanged(object sender, EventArgs e)
{
    if (this.dataGridView.IsCurrentCellDirty)
    {
        this.dataGridView.CommitEdit(DataGridViewDataErrorContexts.Commit);
    }
}

关于这些的任何提示都会有很大帮助。提前致谢。

DataGridViewCheckBoxCell 具有属性 TrueValueFalseValueIndeterminateValue,其默认值为 null。这些是由 属性 Value 根据复选框的状态给出的值。由于 Convert.ToBooleannull 转换为 false,如果属性未初始化,转换结果始终为 false

这些可以在单元格本身或其拥有的列上初始化。

因此,您需要将拥有列 TrueValue 初始化为 true 并将 FalseValue 初始化为 false

设置 TrueValueFalseValueIndeterminateValue 是一个好的开始。

我发现我还需要做更多的工作才能使它起作用;除了你的 CurrentCellDirtyStateChanged 事件,我还编码了这些:

这设置所有 CheckBoxCells:

private void cbx_all_CheckedChanged(object sender, EventArgs e)
{
    if (cbx_all.Tag == null) for (int i = 0; i < dataGridView.RowCount; i++)
    {
        dataGridView.Tag = "busy";
        dataGridView[yourCheckBoxcolumnIndex, i].Value = cbx_all.Checked;
        dataGridView.Tag = null;
    }
}

我编码了 CellValueChanged 而不是 CellContentClick 事件:

private void dataGridView_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
    if (e.ColumnIndex == yourCheckBoxcolumnIndex &&  dataGridView.Tag == null)
    {
       cbx_all.Tag = "busy";
       cbx_all.Checked = testChecks(e.ColumnIndex);
       cbx_all.Tag = null;
    }
}

我用了DGVTag属性和CheckBox作为flag,我很忙通过代码更改值。其他一些避免死循环的方法也一样好。

这是测试函数:

bool testChecks(int index)
{
    for (int r = 0; r < dataGridView.RowCount; r++)
        if  ( !(bool)dataGridView[index, r].Value ) return false;
    return true;
}