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]是否已选中?
我发现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);
}
}