行と列を入れ替えてデータを連結したい。(VS2005)

文書番号 : 22119     文書種別 : 使用方法     最終更新日 : 2006/06/30
文書を印刷する
対象製品
SPREAD for .NET 2.5J Web Forms Edition
詳細
SPREADではデータモデルのデフォルト実装をDefaultSheetDataModelクラスにて提供しています。通常のデータ連結ではこの実装が使用されます。
ただデータモデルの基本的な実装については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
関連情報
キーワード
外観 データ連結

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