0

我的 DataGridView 控件是 DataSource 绑定到 TableAdapter 的。

该表包含每天的销售额:

Date         Sales
12/03/2012   100
12/04/2012   50
12/06/2012   120

我希望 DataGrid 还显示没有使用空单元格进行销售的日子:

Date         Sales
12/03/2012   100
12/04/2012   50
12/05/2012   
12/06/2012   120

如果我更改网格视图中的空单元格(零销售额),我希望将其作为新行写入表中,否则不应将其写入表中。DB 是本地访问文件。

4

3 回答 3

0

您最好的选择可能是使用 OnRowDataBound 并在逐行应用数据时对其进行操作。

http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.gridview.onrowdatabound.aspx

于 2012-12-02T19:18:51.557 回答
0

在这种情况下,我会以不同的方式处理数据检索和存储。

对于 Select 语句,我建议您构建一个 permenat 表,其中包含 10000 行和 2 列,一个从 1 到 10000 的整数,以及一个从过去足够远的日期开始的日期(1900 年 1 月 1 日) ? 2000 年 1 月 1 日?)并在 10000 天后。

然后,您可以在日期列上使用视图(查询)左连接从该表到您的表,并使用适当的开始和停止日期,这利用了 orf RDMS 的最佳属性 - 数据检索和匹配。不幸的是,此查询将不可更新。

反过来说,对于已经填充的行,您需要更新它们,但对于为空的行,您需要插入它们。

我会警告您,我没有尝试过这个,我不确定访问是否可以处理它,但是......如果您将 dbdataadaptor 的 Update 属性设置为运行插入(对于最初的空行)和更新(对于最初填充的行)按该顺序,那么你应该很甜蜜。

更新似乎我错了-查询可以直接在访问中更新-如果您编写以下查询

SELECT     IndexTable.dateIndex, Sales.Sales
FROM       IndexTable
           LEFT OUTER JOIN
           Sales ON IndexTable.dateIndex = Sales.SaleDate)
WHERE      (IndexTable.dateIndex >=
                      (SELECT     MIN(SaleDate) AS Expr1
                        FROM          Sales Sales_2)) AND 
           (IndexTable.dateIndex <=
                      (SELECT     MAX(SaleDate) AS Expr1
                        FROM          Sales Sales_1))

并绑定它,您所做的任何更改都应流回表中。

于 2012-12-02T23:36:02.437 回答
0

在这种情况下,我建议手动处理转换,例如,在 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 更新数据库。

于 2012-12-02T20:11:04.140 回答