2012-10-30 134 views
1

我有一个datagridview已使用datasource属性从数据表中填充。我需要更改单元格的值而不影响数据库。到目前为止,我只能发现我必须首先更改数据绑定项目,但没有关于如何做到这一点的信息。此外,我不想更改数据绑定项目。vb.net更改数据绑定中的单元格的值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: Column 'Column1' is read only.

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

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 

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

+0

你想要什么变化的确切种类做什么呢?将转换应用于datagridview中的显示值而不更改基础数据源非常简单。没有办法“断开”数据源并保持数据显示在网格中。但是,您可以简单地将一个未绑定的网格复制到代码中的数据表中。最后,最简单的方法是更新数据表 - 为什么你不能这样做?您不必将对数据表的更改保存回数据库。 –

+0

这是当我尝试使用以下命令更改单元格内容时出现的错误:DataGridView1.Rows(1).Cells(0).Value =“test”linkdl.dropbox.com/u/60390967/ LANThrax/error.jpg 我刚刚意识到,如果我尝试更改连接到单个字段的单元格的内容,它就可以工作。但是,如果我尝试更改其值为其他字段组合的结果的单元格,例如“(FirstName + LastName)”,则会给出该错误。 – Osprey

+0

嗯,不会工作 - 数据表中的计算列是只读的,没有办法解决这个问题。 http://msdn.microsoft.com/en-us/library/ms810291.aspx但为什么你需要计算列,为什么你想改变它的值?有很多可能的途径来解决你的问题,但它仍然不清楚究竟是什么问题。 –

回答

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; 
} 
+0

我只记得你问过vb.net - 只是在这里发表评论,我会很高兴地将我的代码更新到c#的代码 –

+0

谢谢大卫。我尝试了未绑定的datagridview列方法。 CellValidate事件没有更新单元格,而其他列被更改,因此我使用与更新其他列的方法相同的方法将计算单元格更新为更新。现在我只需要找到一种方法将未绑定列设置为最左边。 – Osprey

+0

DisplayIndex应该为你做这件事 - 不要在具有datagridview项目的计算机上进行测试。 –

相关问题