データソースにDataViewを設定することはできますか?(VS2005)

文書番号 : 21884     文書種別 : 使用方法     最終更新日 : 2006/06/27
文書を印刷する
対象製品
SPREAD for .NET 2.5J Web Forms Edition
詳細
シートのIsTrackingViewStateプロパティをFalseに設定することでDataViewと連結することができます。

SPREADデフォルトの設定では、シートのIsTrackingViewStateプロパティがTrueに設定され、SPREADの状態(データ、スタイル、書式など)をViewStateにて管理しています。また、この状態でデータソース(データベースなど)と連結するにはDataSetを使用する必要があります。データベースを更新する時はSPREADのデータをDataSetとして取得し、DataAdapterのUpdateメソッドにて更新します。

DataViewと連結する場合、まず、シートのIsTrackingViewStateプロパティをFalseに設定します。これにより、SPREADの状態はViewStateでは管理されませんので、SPREAD上のデータが変更された時、この変更はポストバックによって失われてしまいます。変更内容をサーバー側で取得しSPREADに反映する仕組みをアプリケーション側で実装する必要があります。

下記ではSPREADにDataViewを連結し、アプリケーション側でSPREADの状態を管理する例をご紹介します。

具体的には、UpdateCommandイベントが発生する(SPREAD上のデータが変更される)度に、変更内容をデータベースに保存します。そして、ポストバックの度にデータベースからデータを(DataViewとして)取得しSPREADに連結します。

下記のように、IsTrackingViewStateプロパティをFalseに設定しアプリケーション側でSPREADの状態を管理する例を製品ヘルプの下記の項でご案内しています。併せてご覧下さい。

「開発者の手引き」>「状態の管理」>「個々のページ要求に対してデータをロード」


[手順]
1.新規WebフォームにSPREADを配置します。
2.以下のmdbファイルを手順1.で作成したアプリケーション(~.aspx.vb)と同じフォルダに配置します。
 
 mdbファイル:C:¥Program Files¥SpreadNETWeb25¥Samples¥Files¥SpreadSample.mdb(SPREAD製品に付属のサンプルデータベース)
 SQL文 :SELECT * FROM Products
3.下記のコードをコピーし実行します。
4.任意のデータ(ID以外)を変更し、SPREADコマンドバーの「更新」ボタンを押します(DBが更新されます)。

【VB サンプルコード】
  Dim OleDbConnection1 As Data.OleDb.OleDbConnection

  Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    'ポストバックの度にデータを連結する()
    FpSpread1.Sheets(0).IsTrackingViewState = False
    FpSpread1.Sheets(0).DataSource = CreateDataView()

    '列のレイアウトを設定
    FpSpread1.Sheets(0).AutoGenerateColumns = False
    FpSpread1.Sheets(0).Columns(0).DataField = "ID"
    FpSpread1.Sheets(0).Columns(1).DataField = "ProductsName"
    FpSpread1.Sheets(0).Columns(2).DataField = "Capacity"
    FpSpread1.Sheets(0).Columns(3).DataField = "Production"
    FpSpread1.Sheets(0).Columns(4).DataField = "Category"
    FpSpread1.Sheets(0).Columns(5).DataField = "Price"
    FpSpread1.Sheets(0).Columns(6).DataField = "Stock"

    '一次キーを指定し、ReadOnlyに設定
    FpSpread1.Sheets(0).DataKeyField = "ID"
    FpSpread1.Sheets(0).Columns(0).Locked = True
  End Sub

  Public Function CreateDataView() As Data.DataView
    'DataViewを作成します
    'データベースの接続文字列を設定します。
    Dim dbpath As String

    'サーバの物理パスを取得します。
    dbpath = HttpContext.Current.Server.MapPath(Request.ApplicationPath + "/")
    'データベースへのパスを設定します。
    dbpath += "SpreadSample.mdb"

    OleDbConnection1 = New Data.OleDb.OleDbConnection
    OleDbConnection1.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + dbpath + ";Persist Security Info=False;"
    OleDbConnection1.Open()
    Dim OleDbCommand1 As New Data.OleDb.OleDbCommand("select * from Products", OleDbConnection1)
    Dim OleDbDataAdapter1 As New Data.OleDb.OleDbDataAdapter

    OleDbDataAdapter1.SelectCommand = OleDbCommand1

    'DataViewを作成します
    Dim ds As New Data.DataSet
    OleDbDataAdapter1.Fill(ds)

    Dim dview As New Data.DataView(ds.Tables.Item(0), "Production='宮城'", "ID", Data.DataViewRowState.CurrentRows)
    OleDbConnection1.Close()
    Return dview
  End Function

  Protected Sub FpSpread1_UpdateCommand(ByVal sender As Object, ByVal e As FarPoint.Web.Spread.SpreadCommandEventArgs) Handles FpSpread1.UpdateCommand
    'SPREADが更新される度にDBに更新内容を書き込む
    Dim cmdText As String = "UPDATE Products SET ProductsName = ?, Capacity = ?, Production = ?, Category = ?, Price = ?, Stock = ? WHERE ID = ?"
    Dim updateCmd As Data.OleDb.OleDbCommand = New Data.OleDb.OleDbCommand(cmdText, OleDbConnection1)

    updateCmd.Parameters.Add(New System.Data.OleDb.OleDbParameter("ProductsName", System.Data.OleDb.OleDbType.VarWChar, 50, "ProductsName"))
    updateCmd.Parameters.Add(New System.Data.OleDb.OleDbParameter("Capacity", System.Data.OleDb.OleDbType.VarWChar, 30, "Capacity"))
    updateCmd.Parameters.Add(New System.Data.OleDb.OleDbParameter("Production", System.Data.OleDb.OleDbType.VarWChar, 20, "Production"))
    updateCmd.Parameters.Add(New System.Data.OleDb.OleDbParameter("Category", System.Data.OleDb.OleDbType.Integer, 0, "Category"))
    updateCmd.Parameters.Add(New System.Data.OleDb.OleDbParameter("Price", System.Data.OleDb.OleDbType.Integer, 0, "Price"))

    updateCmd.Parameters.Add(New System.Data.OleDb.OleDbParameter("Stock", System.Data.OleDb.OleDbType.Integer, 0, "Stock"))
    updateCmd.Parameters.Add(New System.Data.OleDb.OleDbParameter("ID", System.Data.OleDb.OleDbType.Integer, 0, "ID"))

    Dim sv As FarPoint.Web.Spread.SheetView = e.SheetView
    Dim keyValue As String = CStr(sv.GetDataKey(CInt(e.CommandArgument)))

    ' 行を検索します。
    Dim rowFlag As Boolean = False
    Dim keyCol As Integer = 0 ' ID(一次キー)列の列番号を指定
    Dim r As Integer
    For r = 0 To sv.RowCount - 1
      Dim tmp As String = CStr(sv.GetValue(r, 0))
      If (tmp = keyValue) Then
        rowFlag = True
        Exit For
      End If
    Next

    If Not rowFlag Then
      Return
    End If

    Dim i As Integer
    For i = 0 To sv.ColumnCount - 1
      Dim colName As String = sv.GetColumnLabel(0, i)
      If (Not e.EditValues.Item(i) Is FarPoint.Web.Spread.FpSpread.Unchanged) Then
        updateCmd.Parameters(colName).Value = e.EditValues.Item(i)
      ElseIf (updateCmd.Parameters.Contains(colName)) Then
        updateCmd.Parameters(colName).Value = sv.GetValue(r, i)
      End If
    Next

    Try
      OleDbConnection1.Open()
      i = updateCmd.ExecuteNonQuery()
      OleDbConnection1.Close()
    Catch ex As Exception
      ' データベースの更新が失敗した場合の処理です。
      OleDbConnection1.Close()
      OleDbConnection1.Dispose()
    End Try
  End Sub
関連情報
キーワード
データ連結

この文書は、以前は次のFAQ IDで公開されていました : 9207