vb.net更改数据绑定datagridview中单元格的值

时间:2012-10-30 11:56:46

标签: vb.net datagridview

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

想要这样做的原因是我有一个包含开始和结束时间的记录列表,并且有一个计算字段可以给出以秒为单位的差异。我需要更改计算字段的值并相应地更改行的高度,也就是说,每行的高度与其表示的持续时间成比例。如果“增加”按钮保持不变,则从文本框进行更改,该文本框会快速递增,因此我无法使用每个增量更改数据库。相反,我会经常更改表中的值,并在增量停止后更新数据库。

我尝试使用以下代码直接更新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

有没有办法从数据源中分离网格,但仍然保持数据在数据网格中可见并操纵它(不影响数据绑定对象)?或许还有其他一些解决这个问题的方法?

1 个答案:

答案 0 :(得分: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;
}