DataViewをレコードのステータスで絞り込むサンプル

DataViewをレコードのステータスで絞り込むサンプル

 

このサンプルは、DataViewから追加、変更、削除されたレコードを絞り込んで表示します。DataViewから追加、変更、削除されたレコードを絞り込むには、DataViewRowStateFilterプロパティにレコードのステータスを設定します。追加されたレコードを絞り込むには、RowStateFilterAddedを設定します。変更されたレコードを絞り込むには、ModifiedCurrent/ModifiedOriginalを設定します。ModifiedCurrentは、変更後の値を取得することを意味します。ModifiedOriginalは、変更前の値を取得することを意味します。削除されたレコードを絞り込むには、Deletedを設定します。

 

このサンプルでは、以下のノウハウを取得することができます。

 

 

  得意先テーブルをDataTableに取り込む方法

  DataTableからDataViewを作成する方法

  レコードのステータスを指定してレコードを絞り込む方法

  追加したレコードを絞り込む方法

  変更したレコードを絞り込む方法

  削除したレコードを絞り込む方法

  絞り込んだレコードの件数を取得する方法

 

サンプルのPage_Load()イベントでは、DataViewから追加、変更、削除されたレコードを絞り込んで表示しています。行8-9では、得意先テーブルからレコードを抽出するSQLを生成しています。行10-13では、OleDbConnectionOleDbDataAdapterDataTableを生成しています。

 

15では、OleDbDataAdapterFill()メソッドで得意先テーブルをDataTableに取り込んでいます。行20では、DataTableからDataViewを生成しています。

 

  7: Sub Page_Load()
  8:   Dim strSQL As String = "Select CustomerID, CompanyName, " & _
  9:     "ContactName, Phone From Customers"
 10:   Dim con As New OleDbConnection( _
 11:     ConfigurationSettings.AppSettings("conStringNw"))
 12:   Dim da As New OleDbDataAdapter(strSQL, con)
 13:   Dim dt As New DataTable("Customers")
 14:
 15:   da.Fill(dt)
 20:   Dim dv As New DataView(dt)

:::
 49: End Sub

 

23-27では、DataViewに新規レコードを追加しています。行23では、DataViewAddNew()メソッドでDataRowViewを生成しています。行24-26では、DataRowViewの得意先名、担当者名、電話番号のカラムに値を設定しています。行27では、DataViewEndEdit()メソッドで編集を完了させています。

 

23:   Dim drv As DataRowView = dv.AddNew()
 24:   drv("CompanyName") = "
フレンドリーソフト"
 25:   drv("ContactName") = "
葛西 秋雄"
 26:   drv("Phone") = "(0480)99-9999"
 27:   drv.EndEdit()

30-33では、DataView1番目のレコードを取得して得意先名を変更しています。行30では、DataViewから1番目のレコードを取得してDataRowViewを生成しています。行32では、DataRowViewの得意先名に「※」を追加しています。行30と行32を結合させて、次のように記述することもできます。

 

dv(0)(“CompanyName”) &= “

 

3133BeginEdit()EndEdit()メソッドは、特に必要ありません。BeginEdit()は、CancelEdit()メソッドで変更したレコードを復元するときに使用します。


 30:   drv = dv(0)
 31:   drv.BeginEdit()
 32:   drv("CompanyName") &= "
"
 33:   drv.EndEdit()

36-37では、DataViewから2番目のレコードを取得して削除しています。行36-37を結合させて、次のように記述することもできます。

 

dv(1).Delete()

 

36:   drv = dv(1)
 37:   drv.Delete()

39-48では、DataViewから追加、変更、削除されたレコードを絞り込んで表示します。行39-42では、DataViewRowStateAddedModifiedCurrentDeletedを設定しています。行43では、DataViewRowStateFilterプロパティにDataViewRowStateを設定してレコードを絞り込んでいます。DataViewRowStateには、AddedModifiedCurrentDeletedが設定されていますので追加、変更、削除されたレコードが絞り込まれます。絞り込まれたレコードの件数は、DataViewCountプロパティに格納されています。

 

46-48では、DataViewからDataRowViewを取り出してSub DisplayRow()に渡しています。DisplayRow()では、DataRowViewのすべてのカラム名とカラム値を表示します。

 

39:   Dim dvrs As DataViewRowState = _
 40:     DataViewRowState.ModifiedCurrent _
 41:     Or DataViewRowState.Deleted _
 42:     Or DataViewRowState.Added
 43:   dv.RowStateFilter = dvrs
 44:   Dim intRow As Integer
 45:   Response.Write("<h2>DataView.RowStateFilter</h2>")
 46:   For intRow = 0 To dv.Count - 1
 47:     DisplayRow(dv(intRow))
 48:   Next

Sub DisplayRow()の行52では、DataRowViewRow.TableプロパティからDataTableを取得しています。行53では、DataRowViewRowプロパティからDataRowを取得しています。行55-58For Each…Nextでは、DataTableColumnsコレクションからDataColumnを取り出しています。Response.Write()メソッドでは、カラム名、カラム値、そしてレコードのステータスを表示しています。レコードのステータスは、GetRowState()関数を呼び出して取得しています。

 

51: Sub DisplayRow(drv As DataRowView)
 52:   Dim dt As DataTable = drv.Row.Table
 53:   Dim dr As DataRow = drv.Row
 54:   Dim dc As DataColumn
 55:   For Each dc In dt.Columns
 56:     Response.Write(String.Format("<b>{0}</b>: {1} <b>{2}</b><br>", _
 57:      dc.ColumnName, drv(dc.ColumnName), GetRowState(dr,dc)))
 58:   Next
 59:   Response.Write("<hr>")
 60: End Sub

 

GetRowState()関数では、DataRowRowStateプロパティを調べてレコードのステータスを返します。行64-72If…End Ifでは、カレントのカラムが得意先名か調べています。行65-71If…ElseIf…End Ifでは、DataRowRowStateプロパティを調べて変数にレコードのステータス「(追加)、(変更)、(削除)」を保存します。行73では、Returnステートメントでレコードのステータスを返しています。

 

62: Function GetRowState(dr As DataRow, dc As DataColumn ) As String
 63:   Dim strRowState As String = ""
 64:   If dc.ColumnName = "CompanyName" Then
 65:     If dr.RowState = DataRowState.Added Then
 66:       strRowState = "(
追加)"
 67:     ElseIf dr.RowState = DataRowState.Modified Then
 68:       strRowState = "(
変更)"
 69:     ElseIf dr.RowState = DataRowState.Deleted Then
 70:       strRowState = "(
削除)"
 71:     End If
 72:   End If
 73:   Return strRowState
 74: End Function