在这种情况下,我建议手动处理转换,例如,在 DataAdapter 和 DataGridView 之间创建一个代理类,这样它们就不会直接连接。这样 DataAdapter 将为您保存到数据库,您只需进行转换。
编辑:这里有一些想法可以帮助您入门。下面的代码将创建一个虚拟表,您可以将其用于测试目的 - 它根本不依赖于 DataAdapter:
Dim originalDataTable As New DataTable
With originalDataTable.Columns
.Add("Date", GetType(DateTime))
.Add("Sales", GetType(Integer))
End With
With originalDataTable.Rows
.Add({#12/3/2012#, 100})
.Add({#12/4/2012#, 50})
.Add({#12/6/2012#, 120})
End With
现在准备必要的结构,你将需要这个字典,所以最好声明一个类级别的变量 - 在你的情况下可能是一个表单:
Dim salesDictionary As New Dictionary(Of Date, DataRow)
For Each row As DataRow In originalDataTable.Rows
salesDictionary.Add(row("Date"), row)
Next
Dim minDate As DateTime = salesDictionary.Keys.Min
Dim maxDate As DateTime = salesDictionary.Keys.Max
Dim newTable As DataTable = originalDataTable.Clone
Dim currentDate As DateTime = minDate
Do
Dim row As DataRow = Nothing
If salesDictionary.TryGetValue(currentDate, row) Then
newTable.ImportRow(row)
Else
newTable.Rows.Add({currentDate, Convert.DBNull})
End If
currentDate = currentDate.AddDays(1)
Loop While currentDate <= maxDate
将您的 DataGridView 绑定到newTable
而不是originalDataTable
,并在准备好提交更改时,手动更新相关记录,originalDataTable
如下所示:
For Each row As DataRow In newTable.Rows
Dim newSalesValue As Object = row("Sales")
Dim originalRow As DataRow = Nothing
If salesDictionary.TryGetValue(row("Date"), originalRow) Then
If newSalesValue Is Convert.DBNull Then
originalRow.Delete()
Else
originalRow("Sales") = row("Sales")
End If
ElseIf newSalesValue IsNot Convert.DBNull Then
originalDataTable.ImportRow(row)
End If
Next
然后使用您的 DataAdapter 更新数据库。