0

私のDataGridViewコントロールは、TableAdapterにデータソースバインドされています。

この表には、1日あたりの売上が含まれています。

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

この場合、変換を手動で処理することをお勧めします。たとえば、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

newTableの代わりにDataGridViewをバインドし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 に答える
0

この場合、データの取得と保存を異なる方法で扱います。

Selectステートメントの場合、たとえば10000行で2列、1つは1から10000までの整数、1つは過去の1日から十分に役立つ日付(1/1/1900)のpermenatテーブルを作成することをお勧めします。 ?2000年1月1日?)そして10000日後まで行きます。

次に、このテーブルからテーブルへのビュー(クエリ)左結合を、適切な開始日と終了日を使用して日付列で使用できます。これにより、RDMSの最良の属性(データの取得と照合)が活用されます。残念ながら、このクエリは更新できません。

逆に、すでに入力されている行の場合は更新する必要がありますが、nullの行の場合は挿入する必要があります。

これを試したことがなく、アクセスで処理できるかどうかはわかりませんが、... dbdataadaptorのUpdateプロパティを設定して、挿入(元々null行の場合)と更新(元々null行)を実行した場合最初に入力された行の場合)この順序で、あなたは甘いはずです。

更新私が間違っていたようです-クエリはアクセス時に直接更新可能です-次のクエリを書くと

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

最善の策は、おそらくOnRowDataBoundを使用して、行ごとに適用されるときにデータを操作することです。

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

于 2012-12-02T19:18:51.557 に答える