【问题标题】:DataGridView value doesn't change when calling CellContentClicked event调用 CellContentClicked 事件时 DataGridView 值不会改变
【发布时间】:2015-06-17 09:00:18
【问题描述】:

我的期望:Is WashIs ReturnComboBox 列;当我点击Is Wash时,我打算将Is Return更改为true

这是我的DataGridView

我尝试使用CellContentClickCellClick

下面是我的功能:

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。请帮忙。

【问题讨论】:

  • 问题不清楚请详细说明您想要什么
  • TaW 的另一个回答 option(这已经很有效了)。

标签: c# datagridview


【解决方案1】:

CellClick 中检查DataGridViewCheckboxCells 的问题在于它们还没有新值。这对于其他细胞类型更有意义,它们可能需要或多或少成功地通过或多或少复杂的验证程序,但我们必须忍受它。

根据MSDN,您有两种选择:

通常,复选框单元格值用于存储,例如 任何其他数据,或用于执行批量操作。如果你想 当用户单击复选框单元格时立即响应,您可以处理 DataGridView.CellClick 事件,但此事件发生在 单元格值已更新。如果您在 点击,一种选择是计算期望值是多少 基于当前值。另一种方法是提交更改 立即,并处理 DataGridView.CellValueChanged 事件 回应它。要在单击单元格时提交更改,您必须 处理 DataGridView.CurrentCellDirtyStateChanged 事件。在里面 处理程序,如果当前单元格是复选框单元格,则调用 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...  }
    // ..
}

【讨论】:

  • CurrentCellDirtyStateChanged 方法比计算方法好得多。只需再添加 1 个处理程序,“刷新”更改并像往常一样处理它们。即使它被称为“脏”,它也比另一个干净得多。
【解决方案2】:

taw 的回答很好,感谢您的帮助。您的回答是错误的,因为我已经使用了您要求我使用的方法,但结果还是一样。

最后,我意识到它有什么问题,因为当我勾选复选框时,列本身不会调用单元格值更改方法。因为当我启用编辑时,当你勾选复选框时,数据网格视图将进入“编辑模式”,只有当你退出列时才会调用单元格值更改方法(请参见图片的行标题,图片显示铅笔图标)。在这种情况下,我会尽量不使用启用编辑。感谢帮助。 http://i.stack.imgur.com/Rj1v1.png

【讨论】:

  • 它不会进入CellValueChanged直到数据被提交。但它会立即进入CurrentCellDirtyStateChanged 事件,您可以在其中提交数据。这已经过测试并且工作正常,应该直接来自 MSDN..
  • 您应该接受 TaW 的回答。这是正确的,也是一个很好的解决方案。当你尝试它时,你可能做错了什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-28
  • 2011-03-04
  • 2010-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多