DataGridViewCheckBoxCell可以以编程方式接受CheckState.Indeterminate,但不是通过点击吗?

时间:2015-06-19 18:33:56

标签: c# .net winforms datagridview

我的跟随DataGridViewCheckBoxCell是我DataGridView的一部分:

DataGridViewCheckBoxCell cell = new DataGridViewCheckBoxCell(true) {Value = CheckState.Unchecked};
grdRow.Cells.Add(cell);
grdRow.Tag = key;
grdFilter.Rows.Add(grdRow);

稍后,我会根据是否选中其他复选框来更新其状态。

var numChecked = cells.Count(c => c.Value.Equals(true));
cbCell.Value = (numChecked == cells.Count) ? CheckState.Checked : (numChecked == 0 ? CheckState.Unchecked : CheckState.Indeterminate);

这很有效。但是,如果用户单击该复选框,它将在Checked,Unchecked和Indeterminate之间循环。我只想在 Checked Unchecked 之间循环。

如果我在单元格上将TriState设置为False,则不再允许我将Value设置为CheckState.Indeterminate

有没有办法获得我想要的行为?

更新

我试过像这样捕捉CellValueChanged事件:

void DataGridView_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
    var changedCell = grdFilter.Rows[e.RowIndex].Cells[e.ColumnIndex];
    if(changedCell.Value.Equals(CheckState.Indeterminate))
        changedCell.Value = CheckState.Unchecked;
}

然而,这没有效果。我仍然可以点击这三个州。我已经验证了事件在调试器下发生了,并且Value属性确实设置为CheckState.Unchecked

1 个答案:

答案 0 :(得分:1)

我认为CellValueChanged事件的触发时间太晚,无法捕获用户更改CheckBox列的值。尝试连接CurrentCellDirtyStateChanged事件并提交更改:

void dgv_CurrentCellDirtyStateChanged(object sender, EventArgs e) {
    dgv.CommitEdit(DataGridViewDataErrorContexts.Commit);
}

然后在您的CellValueChanged事件中,您只需更改ThreeState属性:

private void dgv_CellValueChanged(object sender, DataGridViewCellEventArgs e) {
  ((DataGridViewCheckBoxCell)dgv.Rows[e.RowIndex].Cells[e.ColumnIndex]).ThreeState = false;
}

您可能应该过滤列,只在CheckBox列等上执行此操作。