我的期望:Is Wash
和Is Return
是ComboBox
列;当我点击Is Wash
时,我打算将Is Return
更改为true
。
这是我的DataGridView
:
我尝试使用CellContentClick
和CellClick
以下是我的功能:
private void dtGridViewLoan_CellClick(object sender, DataGridViewCellEventArgs e)
{
if (e.RowIndex == -1)
return;
if (dtGridViewLoan.SelectedRows[0].Cells["is_wash"].Value != DBNull.Value)
if (Convert.ToBoolean(dtGridViewLoan.Rows[e.RowIndex].Cells["is_wash"].Value))
{
dtGridViewLoan.Rows[e.RowIndex].Cells["is_return"].Value = true;
}
}
最后,无论我如何更改ComboBox
值,数据本身都会一直返回false
,即使它是true
。请帮忙。
答案 0 :(得分:3)
在DataGridViewCheckboxCells
中检查CellClick
的问题是他们还没有新值。这对其他细胞类型更有意义,其可能或多或少地成功地通过或多或少复杂的验证程序,但我们必须忍受它。
根据MSDN,您有两种选择:
通常,复选框单元格值用于存储,例如 任何其他数据,或用于执行批量操作。如果你想 当用户单击复选框单元格时立即响应,您可以处理 DataGridView.CellClick事件,但此事件发生在之前 单元格值已更新。如果你需要新的价值 单击,一个选项是计算预期值 基于当前值。另一种方法是提交变更 立即,并处理DataGridView.CellValueChanged事件 回应它。要在单击单元格时提交更改,您必须 处理DataGridView.CurrentCellDirtyStateChanged事件。在里面 handler,如果当前单元格是复选框单元格,则调用 DataGridView.CommitEdit方法并传入Commit值。
我发现第一种方法看起来更简单,但相当黑客。
以下是第二种更清洁方法的示例: 首先,我们立即提交任何复选框点击:
// add the event handler to the grid view
dtGridViewLoan.CurrentCellDirtyStateChanged +=
new EventHandler(dtGridViewLoan_CurrentCellDirtyStateChanged);
private void dtGridViewLoan_CurrentCellDirtyStateChanged(object sender, EventArgs e)
{
if (dtGridViewLoan.CurrentCell is DataGridViewCheckBoxCell)
dtGridViewLoan.CommitEdit(DataGridViewDataErrorContexts.Commit);
}
现在,此代码可用于处理新的复选框值:
private void dtGridViewLoan_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
// ..
if (dtGridViewLoan.Columns[e.ColumnIndex].Name == "is_wash")
{ your code here... }
// ..
}
答案 1 :(得分:-1)
最后,我意识到它有什么问题,因为当我勾选复选框时,列本身不会调用单元格值更改方法。因为当我启用编辑功能时,勾选复选框时,数据网格视图将进入编辑模式'当你退出列时,只调用单元格值改变的方法(请参见图片的行标题,图片显示铅笔图标)。我将尝试不对此案例使用启用编辑。感谢帮助。 http://i.stack.imgur.com/Rj1v1.png