我做了一個這樣的資料表:
Dim DTCart As New DataTable
DTCart.Columns.Add(New DataColumn With {.ColumnName = "Code", .DataType = GetType(String)})
DTCart.Columns.Add(New DataColumn With {.ColumnName = "Name", .DataType = GetType(String)})
DTCart.Columns.Add(New DataColumn With {.ColumnName = "Amount", .DataType = GetType(Double)})
DTCart.Columns.Add(New DataColumn With {.ColumnName = "Price", .DataType = GetType(Long)})
DTCart.Columns.Add(New DataColumn With {.ColumnName = "Total", .DataType = GetType(Long), .Expression = "Amount*Price"})
DTCart.Columns("Code").ReadOnly = True
DTCart.Columns("Name").ReadOnly = True
DTCart.Columns("Amount").ReadOnly = False
DTCart.Columns("Price").ReadOnly = True
DTCart.Columns("Total").ReadOnly = True
然后我使用 Datagridview 顯示資料表 DataGridView.DataSource = DTCart
我將“金額”列設定為可編輯,這樣我就可以通過編輯 Datagridview 中的單元格來更新它,如下所示:
Private Sub DataGridViewCart_CellEndEdit(sender As Object, e As DataGridViewCellEventArgs) Handles DataGridViewCart.CellEndEdit
If DataGridViewCart.CurrentRow.Cells(2).Value.ToString = "" Then
DataGridViewCart.CurrentRow.Cells(2).Value = 0
End If
Dim FindRow() As DataRow = DTCart.Select("Code='" & DataGridViewCart.CurrentRow.Cells(0).Value & "'")
FindRow(0)("Amount") = DataGridViewCart.CurrentRow.Cells(2).Value
Total()
End Sub
'Total()' 方法只是對 DataTable 上的 'Total' 列求和的方法,因此我可以將特定標簽的文本設定為其值,如下所示:
Sub Total()
Dim sum As Double = 0
For Each row As DataRow In DTCart.Rows
sum = row.Item("Total")
Next
LabelTotal.Text = sum
End Sub
現在,問題是,當我完成編輯單元格時,DataTable 已更新(我已檢查),但 LabelTotal.Text 未更新。
有趣的是這個問題只在我第一次編輯單元格時出現。當我第二次嘗試編輯同一個單元格時,它完美運行,一切都更新了。
幫助.. :'(
對不起,我的英語不好
uj5u.com熱心網友回復:
我質疑你的評論......
“當我第二次嘗試編輯同一個單元格時,它完美運行,一切都更新了。” ……?
在我的小測驗中……“總計”列的總和總是反映“前一個”總計而不是實際總計。換句話說,LabelTotal總是錯過最后一次更改。
這樣做的原因是因為當代碼對表的“總計”列“求和”時,是當Amount列中的值發生變化時(……注意……更新“運算式”列時不會觸發事件)。因此,當用戶更改Amount網格中的值時,網格的CellEndEdit事件會觸發并對該Total列求和并將該值放入標簽中……但是,由于該Total列是“運算式”列,因此其值尚未更新且不會更新直到網格CellEndEdit退出后……因此最后的“金額”變化不會計算在總和中。
我建議你放棄Total回圈遍歷每一行并對值求和的方法,而是讓它DataTable使用它的Compute方法對Total列進行求和。這可以簡化代碼;但是它不會解決以前的問題。
為了使用Total列的正確總和更新標簽,我建議您AcceptChanges()在呼叫表計算方法之前呼叫表方法。就像是…
Private Sub DataGridView1_CellEndEdit(sender As Object, e As DataGridViewCellEventArgs) Handles DataGridViewCart.CellEndEdit
If DataGridViewCart.CurrentRow.Cells(2).Value.ToString = "" Then
DataGridViewCart.CurrentRow.Cells(2).Value = 0
End If
DTCart.AcceptChanges()
LabelTotal.Text = DTCart.Compute("SUM(Total)", "").ToString()
End Sub
最后,我同意 Mary 的評論,即您應該將Amount,Price和Total列更改為Decimal。否則,您將丟失小數部分。
編輯…在不呼叫資料表AcceptChanges()方法的情況下獲得正確的總和…
進一步查看后,您可能不想呼叫資料表AcceptChanges事件。除了您可能正在跟蹤所做更改的可能情況之外,還對示例進行了評論。在這種情況下,您可以改為連接DataTable.RowChanged事件。它將在運算式列更新后觸發,因此 SUM 應該是正確的。這可能看起來像……
AddHandler DTCart.RowChanged, AddressOf DTCart_RowChanged
將上面的行添加到 Forms Load 事件...和下??面的事件...
Private Sub DTCart_RowChanged(sender As Object, e As DataRowChangeEventArgs)
LabelTotal.Text = DTCart.Compute("SUM(Total)", "").ToString()
End Sub
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/378930.html
