MESCIUS SPREAD for Windows Forms 17.0J サンプルコード集
非連結列を追加する

データ連結を行った際、非連結行を追加する場合にはSheetViewクラスのAddUnboundRowsメソッド呼び出しを行いますが、非連結列を追加する場合には通常のAddColumns メソッド呼び出しを行うことができます。(SPREADにはデータソースに対して列フィールドを新規に追加するという概念がありません)

以下のサンプルではデータ連結後に非連結列を追加し、各列に数式を設定することで小計/合計を表示させる例を紹介します。

【実行例】

非連結列の設定

  • 列の連結状態はSheetViewクラスのIsColumnBound メソッド呼び出しによって取得できます。
  • 便宜上、当サンプルではデータセットを手動で作成しています。(DataSetの他にもDataTableやDataViewとの連結が可能です) SQL ServerやOracle等との接続に関する一般的な手法については各種参考文献をご参照ください。
  • 最終的なデータベースへの反映はDataAdapterのUpdateメソッド呼び出し等の対応が必要となります。また、テーブルの排他制御等についてもADO.NETの仕様に基づき適切に行う必要があります。詳細についてはMSDNライブラリをご参照ください。
  • DataRowのRowStateはセルデータの変更だけでは更新(Modified)されず、標準のDataGridViewコントロールと同様、アクティブセルが他の行に移動したタイミングで更新されます。
  • データ連結時には関連データベースフィールドのデータに基づき、列のサイズ(幅)が自動的に設定されます。また、 列のセル型列ヘッダのテキストも自動的に変更されます。

    つまり、連結によって あらかじめデザイナにて設定された各種スタイル情報は全て無効となることに注意が必要です。このような場合は、以下の各プロパティ(SheetViewクラスメンバ)を必要に応じてFalse(デフォルトはTrue)に変更するか、連結後にコーディングによって各スタイル情報を設定する等の対応も必要となります。

    [DataAutoSizeColumns] : フィールドのデータに基づき、列のサイズを自動的に変更します
    [DataAutoCellTypes] : 各列のセル型を自動的に設定します
    [DataAutoHeadings] : 列ヘッダのテキストにするデータフィールド名を自動的に割り当てます

    また、階層表示における子階層(子ビュー)も同様の仕様となるため、この場合も必要に応じて上記変更を行う必要があります。具体的には子ビュー生成のタイミングで発生するChildViewCreatedイベントを実装し、ChildViewCreatedEventArgsクラスである引数eのSheetViewに対して変更を行います。

※出力例については本コンテンツ末尾を参照

 private void Form1_Load(object sender, System.EventArgs e)
 {

   //データセットを手動で作成します
   DataTable DT = new DataTable();
   DataSet DS = new DataSet();
   DT = DS.Tables.Add("SampleTable");
   DT.Columns.AddRange(new DataColumn[] {
               new DataColumn("Num1", Type.GetType("System.Int32")),
               new DataColumn("Num2", Type.GetType("System.Int32")),
               new DataColumn("Num3", Type.GetType("System.Int32"))
               });

   DT.Rows.Add(new object[] {10, 100, 1000});
   DT.Rows.Add(new object[] {20, 200, 2000});
   DT.Rows.Add(new object[] {30, 300, 3000});
   DT.Rows.Add(new object[] {40, 400, 4000});
   DT.Rows.Add(new object[] {50, 500, 5000});

   //データセットを接続します
   fpSpread1.DataSource = DS;

   //列を追加します(列は非連結となります)
   fpSpread1.ActiveSheet.AddColumns(2, 1);
   fpSpread1.ActiveSheet.AddColumns(fpSpread1.ActiveSheet.ColumnCount, 1);

   //小計を表示します
   fpSpread1.ActiveSheet.ReferenceStyle = FarPoint.Win.Spread.Model.ReferenceStyle.R1C1;
   fpSpread1.ActiveSheet.SetColumnLabel(0, 2, "小計");
   fpSpread1.ActiveSheet.Columns[2].Formula = "SUBTOTAL(9,RC[-2]:RC[-1])";
   fpSpread1.ActiveSheet.Columns[2].BackColor = Color.LightCyan;
   fpSpread1.ActiveSheet.ColumnHeader.Cells[0, 2].BackColor = Color.LightCyan;
   fpSpread1.ActiveSheet.SetColumnWidth(2, 40);

   //合計を表示します
   fpSpread1.ActiveSheet.SetColumnLabel(0, fpSpread1.ActiveSheet.ColumnCount - 1, "合計");
   fpSpread1.ActiveSheet.Columns[fpSpread1.ActiveSheet.ColumnCount - 1].Formula = "SUBTOTAL(9,RC[-4]:RC[-1])";
   fpSpread1.ActiveSheet.Columns[fpSpread1.ActiveSheet.ColumnCount - 1].BackColor = Color.LightPink;
   fpSpread1.ActiveSheet.ColumnHeader.Cells[0, fpSpread1.ActiveSheet.ColumnCount - 1].BackColor = Color.LightPink;
   fpSpread1.ActiveSheet.SetColumnWidth(fpSpread1.ActiveSheet.ColumnCount - 1, 40);

   //連結状態を取得します
   for (int i = 0; i < fpSpread1.ActiveSheet.ColumnCount; i++)
   {
      if (fpSpread1.ActiveSheet.IsColumnBound(i) == true)
      {
         Console.WriteLine("列:" + fpSpread1.ActiveSheet.Columns[i].Label + "は連結されています");
      }
      else
      {
         Console.WriteLine("列:" + fpSpread1.ActiveSheet.Columns[i].Label + "は連結されていません");
      }
   }

 }
 Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load

   'データセットを作成します
   Dim DT As New DataTable
   Dim DS As New DataSet
   DT = DS.Tables.Add("SampleTable")
   DT.Columns.AddRange(New DataColumn() { _
               New DataColumn("Num1", Type.GetType("System.Int32")), _
               New DataColumn("Num2", Type.GetType("System.Int32")), _
               New DataColumn("Num3", Type.GetType("System.Int32")) _
               })

   DT.Rows.Add(New Object() {10, 100, 1000})
   DT.Rows.Add(New Object() {20, 200, 2000})
   DT.Rows.Add(New Object() {30, 300, 3000})
   DT.Rows.Add(New Object() {40, 400, 4000})
   DT.Rows.Add(New Object() {50, 500, 5000})

   'データセットを接続します
   FpSpread1.DataSource = DS

   '列を追加します(列は非連結となります)
   FpSpread1.ActiveSheet.AddColumns(2, 1)
   FpSpread1.ActiveSheet.AddColumns(FpSpread1.ActiveSheet.ColumnCount, 1)

   '小計を表示します
   FpSpread1.ActiveSheet.ReferenceStyle = FarPoint.Win.Spread.Model.ReferenceStyle.R1C1
   FpSpread1.ActiveSheet.SetColumnLabel(0, 2, "小計")
   FpSpread1.ActiveSheet.Columns(2).Formula = "SUBTOTAL(9,RC[-2]:RC[-1])"
   FpSpread1.ActiveSheet.Columns(2).BackColor = Color.LightCyan
   FpSpread1.ActiveSheet.ColumnHeader.Cells(0, 2).BackColor = Color.LightCyan
   FpSpread1.ActiveSheet.SetColumnWidth(2, 40)

   '合計を表示します
   FpSpread1.ActiveSheet.SetColumnLabel(0, FpSpread1.ActiveSheet.ColumnCount - 1, "合計")
   FpSpread1.ActiveSheet.Columns(FpSpread1.ActiveSheet.ColumnCount - 1).Formula = "SUBTOTAL(9,RC[-4]:RC[-1])"
   FpSpread1.ActiveSheet.Columns(FpSpread1.ActiveSheet.ColumnCount - 1).BackColor = Color.LightPink
   FpSpread1.ActiveSheet.ColumnHeader.Cells(0, FpSpread1.ActiveSheet.ColumnCount - 1).BackColor = Color.LightPink
   FpSpread1.ActiveSheet.SetColumnWidth(FpSpread1.ActiveSheet.ColumnCount - 1, 40)

   '連結状態を取得します
   For i As Integer = 0 To FpSpread1.ActiveSheet.ColumnCount - 1
      If FpSpread1.ActiveSheet.IsColumnBound(i) Then
         Console.WriteLine("列:" + FpSpread1.ActiveSheet.Columns(i).Label + "は連結されています")
      Else
         Console.WriteLine("列:" + FpSpread1.ActiveSheet.Columns(i).Label + "は連結されていません")
      End If
   Next

 End Sub

出力例

列:Num1は連結されています
列:Num2は連結されています
列:小計は連結されていません
列:Num3は連結されています
列:合計は連結されていません

 

 


© MESCIUS inc. All rights reserved.