行と列を入れ替えてデータを連結したい。(VS2005)
対象製品
SPREAD for .NET 2.5J Web Forms Edition
詳細
SPREADではデータモデルのデフォルト実装をDefaultSheetDataModelクラスにて提供しています。通常のデータ連結ではこの実装が使用されます。
ただデータモデルの基本的な実装についてはDefaultSheetDataModelクラスの親クラスBaseSheetDataModelクラスにて提供しています。
製品ではこのような構成にてお客様自身でデータモデルクラスを独自に実装できる自由度を取り入れています。
BaseSheetDataModelクラスのサブクラスを作成することで行と列を入れ替えたデータモデルを作成することができます。
  
メモ
下記、サンプルコードです。
【サンプル概要】
製品付属のサンプルデータベースのPRODUCTSテーブルに連結しています。
<SPREAD Install>Samples2FilesSpreadSampleBackUp.mdb
新規WebフォームにてSPREAD, Buttonを配置しただけの状態で下記サンプルコードを追加して下さい。
また、製品付属のサンプルデータベースを「SpreadSample.mdb」の名前で作成したアプリケーション(~.aspx.vb)と同じフォルダにコピーします。
【VB サンプルコード】
ただデータモデルの基本的な実装についてはDefaultSheetDataModelクラスの親クラスBaseSheetDataModelクラスにて提供しています。
製品ではこのような構成にてお客様自身でデータモデルクラスを独自に実装できる自由度を取り入れています。
BaseSheetDataModelクラスのサブクラスを作成することで行と列を入れ替えたデータモデルを作成することができます。
  

- 既存クラスの継承は.NETアプリケーション開発における一般的な手法です。継承方法の詳細についてはMSDNライブラリをご参照ください。(既存クラスのカスタマイズ方法については弊社サポートサービス対象外となります)
下記、サンプルコードです。
【サンプル概要】
製品付属のサンプルデータベースのPRODUCTSテーブルに連結しています。
<SPREAD Install>Samples2FilesSpreadSampleBackUp.mdb
新規WebフォームにてSPREAD, Buttonを配置しただけの状態で下記サンプルコードを追加して下さい。
また、製品付属のサンプルデータベースを「SpreadSample.mdb」の名前で作成したアプリケーション(~.aspx.vb)と同じフォルダにコピーします。
【VB サンプルコード】
-----------------------------------------
Webフォームクラス
-----------------------------------------
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
If IsPostBack Then
Return
End If
' データベースの接続文字列を設定します。
Dim dbpath As String
' サーバの物理パスを取得します。
dbpath = HttpContext.Current.Server.MapPath(Request.ApplicationPath + "/")
' データベースへのパスを設定します。
dbpath += "SpreadSample.mdb"
Dim OleDbConnection1 As New Data.OleDb.OleDbConnection
OleDbConnection1.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0Data 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
Dim ds As New Data.DataSet
OleDbDataAdapter1.Fill(ds)
' SPREADにデータを連結
FpSpread1.ActiveSheetView.DataModel = New MyModel(ds, Nothing)
OleDbConnection1.Close()
End Sub
Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
' クライアント側の変更を確定します。
FpSpread1.SaveChanges()
Dim model As MyModel = CType(FpSpread1.ActiveSheetView.DataModel, MyModel)
Dim ds As Data.DataSet = model.GetDataSet()
' データベースの接続文字列を設定します。
Dim dbpath As String
' サーバの物理パスを取得します。
dbpath = HttpContext.Current.Server.MapPath(Request.ApplicationPath + "/")
' データベースへのパスを設定します。
dbpath += "SpreadSample.mdb"
' データベースと接続します。
Dim OleDbConnection1 As New Data.OleDb.OleDbConnection
OleDbConnection1.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0Data Source=" + dbpath + "Persist Security Info=False"
OleDbConnection1.Open()
' OleDbDataAdapterのUpdateCommand プロパティを設定します。
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 i As Integer
For i = 0 To ds.Tables(0).Columns.Count - 1
updateCmd.Parameters("ID").Value = ds.Tables(0).Rows(0).Item(i)
updateCmd.Parameters("ProductsName").Value = ds.Tables(0).Rows(1).Item(i)
updateCmd.Parameters("Capacity").Value = ds.Tables(0).Rows(2).Item(i)
updateCmd.Parameters("Production").Value = ds.Tables(0).Rows(3).Item(i)
updateCmd.Parameters("Category").Value = ds.Tables(0).Rows(4).Item(i)
updateCmd.Parameters("Price").Value = ds.Tables(0).Rows(5).Item(i)
updateCmd.Parameters("Stock").Value = ds.Tables(0).Rows(6).Item(i)
Next
Dim OleDbDataAdapter1 As New Data.OleDb.OleDbDataAdapter
OleDbDataAdapter1.UpdateCommand = updateCmd
Try
OleDbDataAdapter1.Update(ds)
OleDbConnection1.Close()
Catch ex As Exception
' データベースの更新が失敗した場合の処理です。
OleDbConnection1.Close()
OleDbConnection1.Dispose()
End Try
End Sub
-----------------------------------------
カスタムデータモデルクラス
-----------------------------------------
<Serializable()> Public Class MyModel
''カスタムデータモデルを作成します。
Inherits FarPoint.Web.Spread.Model.BaseSheetDataModel
Private dataset As Data.DataSet = Nothing
Private datamember As String = String.Empty
Private rCount As Integer = 0
Public Sub New(ByVal ds As Data.DataSet, ByVal dm As String)
dataset = ds
datamember = dm
End Sub
Public Overrides Function GetValue(ByVal row As Integer, ByVal col As Integer) As Object
''任意のセルに値を返します。
Dim dt As Data.DataTable = Me.GetDataTable()
If dt Is Nothing Then
Return Nothing
Else
Return dt.Rows(col).Item(row)
End If
End Function
Public Overrides Sub SetValue(ByVal row As Integer, ByVal col As Integer, ByVal val As Object)
''行と列を入れ替えてデータセットにデータを設定します。
Dim dt As Data.DataTable = Me.GetDataTable()
If Not (dt Is Nothing) Then
dt.Rows(col).Item(row) = val
End If
End Sub
Public Function GetDataSet() As Data.DataSet
''行と列を入れ替えてSPREADにデータを設定します。
If dataset Is Nothing Then
Return Nothing
Else
Return dataset
End If
End Function
Public Function GetDataTable() As Data.DataTable
''接続しているデータテーブルを返します。
If dataset Is Nothing Then
Return Nothing
Else
If datamember Is Nothing Or datamember = String.Empty Then
Return dataset.Tables(0)
Else
Return dataset.Tables(datamember)
End If
End If
End Function
Public Overrides Property RowCount() As Integer
''SPREADの行数を設定または取得します。
Get
Dim dt As Data.DataTable = GetDataTable()
If (dt Is Nothing) Then
Return 0
Else
Return dt.Columns.Count
End If
End Get
Set(ByVal Value As Integer)
End Set
End Property
Public Overrides Property ColumnCount() As Integer
''SPREADの列数を設定または取得します。
Get
Dim dt As Data.DataTable = GetDataTable()
If (dt Is Nothing) Then
Return 0
Else
Return dt.Rows.Count
End If
End Get
Set(ByVal Value As Integer)
End Set
End Property
Public Overrides Function IsEditable(ByVal row As Integer, ByVal col As Integer) As Boolean
Return True
End Function
End Class
Webフォームクラス
-----------------------------------------
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
If IsPostBack Then
Return
End If
' データベースの接続文字列を設定します。
Dim dbpath As String
' サーバの物理パスを取得します。
dbpath = HttpContext.Current.Server.MapPath(Request.ApplicationPath + "/")
' データベースへのパスを設定します。
dbpath += "SpreadSample.mdb"
Dim OleDbConnection1 As New Data.OleDb.OleDbConnection
OleDbConnection1.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0Data 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
Dim ds As New Data.DataSet
OleDbDataAdapter1.Fill(ds)
' SPREADにデータを連結
FpSpread1.ActiveSheetView.DataModel = New MyModel(ds, Nothing)
OleDbConnection1.Close()
End Sub
Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
' クライアント側の変更を確定します。
FpSpread1.SaveChanges()
Dim model As MyModel = CType(FpSpread1.ActiveSheetView.DataModel, MyModel)
Dim ds As Data.DataSet = model.GetDataSet()
' データベースの接続文字列を設定します。
Dim dbpath As String
' サーバの物理パスを取得します。
dbpath = HttpContext.Current.Server.MapPath(Request.ApplicationPath + "/")
' データベースへのパスを設定します。
dbpath += "SpreadSample.mdb"
' データベースと接続します。
Dim OleDbConnection1 As New Data.OleDb.OleDbConnection
OleDbConnection1.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0Data Source=" + dbpath + "Persist Security Info=False"
OleDbConnection1.Open()
' OleDbDataAdapterのUpdateCommand プロパティを設定します。
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 i As Integer
For i = 0 To ds.Tables(0).Columns.Count - 1
updateCmd.Parameters("ID").Value = ds.Tables(0).Rows(0).Item(i)
updateCmd.Parameters("ProductsName").Value = ds.Tables(0).Rows(1).Item(i)
updateCmd.Parameters("Capacity").Value = ds.Tables(0).Rows(2).Item(i)
updateCmd.Parameters("Production").Value = ds.Tables(0).Rows(3).Item(i)
updateCmd.Parameters("Category").Value = ds.Tables(0).Rows(4).Item(i)
updateCmd.Parameters("Price").Value = ds.Tables(0).Rows(5).Item(i)
updateCmd.Parameters("Stock").Value = ds.Tables(0).Rows(6).Item(i)
Next
Dim OleDbDataAdapter1 As New Data.OleDb.OleDbDataAdapter
OleDbDataAdapter1.UpdateCommand = updateCmd
Try
OleDbDataAdapter1.Update(ds)
OleDbConnection1.Close()
Catch ex As Exception
' データベースの更新が失敗した場合の処理です。
OleDbConnection1.Close()
OleDbConnection1.Dispose()
End Try
End Sub
-----------------------------------------
カスタムデータモデルクラス
-----------------------------------------
<Serializable()> Public Class MyModel
''カスタムデータモデルを作成します。
Inherits FarPoint.Web.Spread.Model.BaseSheetDataModel
Private dataset As Data.DataSet = Nothing
Private datamember As String = String.Empty
Private rCount As Integer = 0
Public Sub New(ByVal ds As Data.DataSet, ByVal dm As String)
dataset = ds
datamember = dm
End Sub
Public Overrides Function GetValue(ByVal row As Integer, ByVal col As Integer) As Object
''任意のセルに値を返します。
Dim dt As Data.DataTable = Me.GetDataTable()
If dt Is Nothing Then
Return Nothing
Else
Return dt.Rows(col).Item(row)
End If
End Function
Public Overrides Sub SetValue(ByVal row As Integer, ByVal col As Integer, ByVal val As Object)
''行と列を入れ替えてデータセットにデータを設定します。
Dim dt As Data.DataTable = Me.GetDataTable()
If Not (dt Is Nothing) Then
dt.Rows(col).Item(row) = val
End If
End Sub
Public Function GetDataSet() As Data.DataSet
''行と列を入れ替えてSPREADにデータを設定します。
If dataset Is Nothing Then
Return Nothing
Else
Return dataset
End If
End Function
Public Function GetDataTable() As Data.DataTable
''接続しているデータテーブルを返します。
If dataset Is Nothing Then
Return Nothing
Else
If datamember Is Nothing Or datamember = String.Empty Then
Return dataset.Tables(0)
Else
Return dataset.Tables(datamember)
End If
End If
End Function
Public Overrides Property RowCount() As Integer
''SPREADの行数を設定または取得します。
Get
Dim dt As Data.DataTable = GetDataTable()
If (dt Is Nothing) Then
Return 0
Else
Return dt.Columns.Count
End If
End Get
Set(ByVal Value As Integer)
End Set
End Property
Public Overrides Property ColumnCount() As Integer
''SPREADの列数を設定または取得します。
Get
Dim dt As Data.DataTable = GetDataTable()
If (dt Is Nothing) Then
Return 0
Else
Return dt.Rows.Count
End If
End Get
Set(ByVal Value As Integer)
End Set
End Property
Public Overrides Function IsEditable(ByVal row As Integer, ByVal col As Integer) As Boolean
Return True
End Function
End Class
関連情報
キーワード
外観 データ連結
この文書は、以前は次のFAQ IDで公開されていました : 9384