2012-10-30 169 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項目的計算機上進行測試。 –

相關問題