Datagridview Datagridcheckbox单元格值与GUI不匹配

本文关键字:GUI 不匹配 Datagridcheckbox 单元格 Datagridview | 更新日期: 2023-09-27 18:25:10

我有一个未绑定的DataGridView,它有6列,第一列是DataGridCheckBoxColumn。当用户单击复选框单元格时,我想确定哪些单元格已被选中,哪些单元格未被选中。这是我的代码:

private void UpdateSelectedPlaces()
{
    //Clear out the places list each time the user selects a new item (or items)
    _selectedPlaces.Clear();
    foreach (DataGridViewRow row in placesGridView.Rows)
    {
        if (row.Cells[0].Value != null && row.Cells[0].Value.Equals(true))
        {
            _selectedPlaces.Add((TripPlace)row.DataBoundItem);
        }
    }
}
//Click event handler
private void placesGridView_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
    UpdateSelectedPlaces();
}

我发现DataGridCheckBoxCells在单击时没有保存正确的值。所有行都会发生这种情况。似乎真的没有什么模式。我希望活动没有在正确的时间调用(即复选框的检查尚未完成),但我无法证明这一点。

简而言之,即使GUI显示一个已选中的复选框,后端在使用.Value是否有更简单的方法来确定数据网格视图中每个单元格[0]是否已选中?

Datagridview Datagridcheckbox单元格值与GUI不匹配

我发现DataGridCheckBoxCells没有保存单击时的正确值。

这是正常的,也是故意的,因为您正在使用DataGridView.CellContentClick事件。来自MSDN:

使用此事件检测DataGridViewButtonCell或单击链接可获得DataGridViewLinkCell
点击DataGridViewCheckBoxCell此事件发生在复选框之前更改值,因此如果您不想计算预期值基于当前值,您通常会处理DataGridView.CellValueChanged事件。因为该事件发生仅当提交用户指定的值时,通常焦点离开单元格时发生,您还必须处理DataGridView.CurrentCellDirtyStateChanged事件。

更正后的代码与其他答案类似,但不幸的是,该答案中没有解释问题的原因。

private void UpdateSelectedPlaces()
{
    //Clear out the places list each time the user selects a new item (or items)
    _selectedPlaces.Clear();
    foreach (DataGridViewRow row in placesGridView.Rows)
    {
        if (row.Cells[0].Value != null && row.Cells[0].Value.Equals(true))
        {
            _selectedPlaces.Add((TripPlace)row.DataBoundItem);
        }
    }
}

private void placesGridView_CellValueChanged(object sender, DataGridViewCellEventArgs e)
    {
        UpdateSelectedPlaces();
    }
private void placesGridView_CurrentCellDirtyStateChanged(object sender, EventArgs e)
{
    if (placesGridView.IsCurrentCellDirty)
    {
        placesGridView.CommitEdit(DataGridViewDataErrorContexts.Commit);
    }
}
private void placesGridView_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
    Boolean bl;
    if (placesGridView.Columns[e.ColumnIndex].Name == "name of check column")
    {
        DataGridViewCheckBoxCell checkCell = (DataGridViewCheckBoxCell)placesGridView.Rows[e.RowIndex].Cells[2]; //2 number of check column
        //bl is the check box current condition.
        //Change only this in your list eg list[e.RowIndex] = bl; No need to check all rows.
        bl = (Boolean)checkCell.Value; 
    }
}
private void placesGridView_CurrentCellDirtyStateChanged(object sender, EventArgs e)
{
    if (placesGridView.IsCurrentCellDirty)
    {
        placesGridView.CommitEdit(DataGridViewDataErrorContexts.Commit);
    }
}