MESCIUS SPREAD for Windows Forms 17.0J サンプルコード集
特定の列だけを連結する(フィールド順を変更する)

FpSpreadクラスのDataSourceプロパティに対してデータセットを設定した場合、デフォルトでは全てのフィールドが自動的に連結されます。しかし、以下の手順によって表示フィールドの位置(順番)を変更したり、ある特定のフィールドのみを連結するようなことも可能です。

  1. デフォルトではデーターソースに基づいて列が自動的に生成されるため、あらかじめSheetViewクラスのAutoGenerateColumns プロパティをFalseにすることでこの動作を無効とします
  2. データセットを連結します
  3. 各列(Columnクラス)のDataFieldプロパティに対し、それぞれのデーターフィールドを設定します

【実行例】 データセットとの連結(デフォルト)

全フィールド連結

特定フィールドとの連結および順序の変更

特定フィールド連結

  • 便宜上、当サンプルではデータセットを手動で作成しています。(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に対して変更を行います。
  • 1レコードを複数行で表示する機能はありません。

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

   //連結時の列自動生成を無効とします
   fpSpread1.ActiveSheet.AutoGenerateColumns = false;

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

   DT.Rows.Add(new object[] {10, "Text-10", true});
   DT.Rows.Add(new object[] {20, "Text-20", false});
   DT.Rows.Add(new object[] {30, "Text-30", false});
   DT.Rows.Add(new object[] {40, "Text-40", true});
   DT.Rows.Add(new object[] {50, "text-50", true});

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

   //特定フィールドのみを連結します
   fpSpread1.ActiveSheet.Columns[0].DataField = "Check";
   fpSpread1.ActiveSheet.Columns[1].DataField = "ID";

   fpSpread1.ActiveSheet.ColumnCount = 2;

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

   '連結時の列自動生成を無効とします
   FpSpread1.ActiveSheet.AutoGenerateColumns = False

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

   DT.Rows.Add(New Object() {10, "Text-10", True})
   DT.Rows.Add(New Object() {20, "Text-20", False})
   DT.Rows.Add(New Object() {30, "Text-30", False})
   DT.Rows.Add(New Object() {40, "Text-40", True})
   DT.Rows.Add(New Object() {50, "Text-50", True})

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

   '特定フィールドのみを連結します
   FpSpread1.ActiveSheet.Columns(0).DataField = "Check"
   FpSpread1.ActiveSheet.Columns(1).DataField = "ID"

   FpSpread1.ActiveSheet.ColumnCount = 2

 End Sub

 

 


© MESCIUS inc. All rights reserved.