1

我有一个使用 datasource 属性从数据表中填充的 datagridview。我需要在不影响数据库的情况下更改单元格的值。到目前为止,我只能发现我必须首先更改数据绑定项目,但没有关于如何做到这一点的信息。此外,我不想更改数据绑定项。

想要这样做的原因是我有一个包含开始时间和结束时间的记录列表,并且有一个计算字段以秒为单位给出差异。我需要改变计算域的值,并相应地改变行的高度,即每行的高度与它所代表的持续时间成正比。更改是从文本框中完成的,如果“增加”按钮被按住,该文本框会快速增加,因此我无法在每次增加时更改数据库。相反,我会经常更改表中的值,并在增量停止后更新数据库。

我尝试使用以下代码直接更新 datagridview:

dgvTasks.Rows(SelectedRowIndex).Cells(5).Value = DateAdd(DateInterval.Minute, DateDiff(DateInterval.Minute, CDate("00:00:00"), CDate(txtDuration.Text & ":00")), dgvTasks.Rows(SelectedRowIndex).Cells(4).Value)

但收到错误:

System.Data.ReadOnlyException:列 'Column1' 是只读的。

我还尝试更新数据表,并允许更新计算列:

dtblTasks.Rows(SelectedRowIndex)(5) = DateAdd(DateInterval.Minute, DateDiff(DateInterval.Minute, CDate("00:00:00"), CDate(txtDuration.Text & ":00")), dtblTasks.Rows(SelectedRowIndex)(4)) 
dgvTasks.DataSource = dtblTasks

但计算值不会改变。

我还提供了一个额外的计算值(在 SQL 中),我在其中找到了以分钟为单位的差异,并将字符串文字附加到该值:

( CAST ( DATEDIFF(MINUTE, Tasks.TaskStart, Tasks.TaskEnd) AS NVARCHAR(10) ) + ' mins') AS TaskDurationString

有没有办法将网格与数据源分离,但仍保持数据在数据网格中可见并对其进行操作(不影响数据绑定对象)?或者也许是解决这个问题的其他方法?

4

1 回答 1

3

更新应该工作的计算列DataTable- 我刚刚尝试过,当我编辑作为计算值一部分的值之一时,以及当我更改代码中的值时,都会重新计算该列和网格 UI更新。

要检查的一件事是您正在正确计算该值。您应该使用DataTable~ column [Expression` 属性] 1。像这样的东西:

dt.Columns["FullName"].Expression = "FirstName + LastName";

由于您实际上不需要将任何这些值绑定DataTable到数据库或将它们持久保存到数据库中,因此一种可能的解决方案是在未绑定的DataGridView计算列中完成所有这些操作。

为此,使用设计器添加一列,然后在单元格验证事件中具有如下内容:

void dataGridView1_CellValidated(object sender, DataGridViewCellEventArgs e)
{
    dataGridView1.Rows[e.RowIndex].Cells["TargetColumn"].Value = dataGridView1.Rows[e.RowIndex].Cells["FirstName"].Value.ToString() + dataGridView1.Rows[e.RowIndex].Cells["LastName"].Value.ToString();
    dataGridView1.Rows[e.RowIndex].Height = dataGridView1.Rows[e.RowIndex].Cells["LastName"].Value.ToString().Length + dataGridView1.Rows[e.RowIndex].Cells["FullName"].Value.ToString().Length;
}
于 2012-11-01T20:04:13.473 回答