データソースにDataViewを設定することはできますか?(VS2002/VS2003)
対象製品
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.WebフォームにOleDbDataAdapterを配置し、ウィザードで次の接続先とSQL文を設定します。
接続先:C:¥Program Files¥SpreadNETWeb25¥Samples¥Files¥SpreadSample.mdb(SPREAD製品に付属のサンプルデータベース)
SQL文 :SELECT * FROM Products
3.下記のコードをコピーし実行します。
4.任意のデータ(ID以外)を変更し、SPREADコマンドバーの「更新」ボタンを押します(DBが更新されます)。
【VB サンプルコード】
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.WebフォームにOleDbDataAdapterを配置し、ウィザードで次の接続先とSQL文を設定します。
接続先:C:¥Program Files¥SpreadNETWeb25¥Samples¥Files¥SpreadSample.mdb(SPREAD製品に付属のサンプルデータベース)
SQL文 :SELECT * FROM Products
3.下記のコードをコピーし実行します。
4.任意のデータ(ID以外)を変更し、SPREADコマンドバーの「更新」ボタンを押します(DBが更新されます)。
【VB サンプルコード】
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.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 DataView
'DataViewを作成します
Dim ds As New DataSet
OleDbDataAdapter1.Fill(ds)
Dim dview As New DataView(ds.Tables("Products"), "Production='宮城'", "ID", DataViewRowState.CurrentRows)
Return dview
End Function
Private 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 OleDb.OleDbCommand = New 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
'ポストバックの度にデータを連結する
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 DataView
'DataViewを作成します
Dim ds As New DataSet
OleDbDataAdapter1.Fill(ds)
Dim dview As New DataView(ds.Tables("Products"), "Production='宮城'", "ID", DataViewRowState.CurrentRows)
Return dview
End Function
Private 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 OleDb.OleDbCommand = New 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で公開されていました : 9120