GrapeCity SPREAD for Windows Forms 12.0J サンプルコード集
子階層のデザインを設定する

階層表示されているシートでは、親階層(親ビュー)に対して子階層(子ビュー)がそれぞれ関連付けられますが、両者は基本的に独立したオブジェクトとなっています。例えば以下のようにアクティブシート上の行の背景色を設定した場合、設定は親ビューに対してのみ行われます。

       FpSpread1.ActiveSheet.Rows(0).BackColor = Color.Red

そのため、子ビューの背景色を設定したい場合には各親ビューに関連付けられている子ビューオブジェクトを取得(ChildViewCreatedイベントの実装)し、この子ビューに対して行う必要があります。具体的には以下のサンプルをご参照ください。なお、デザイナにて子階層のデザインを設定することはできません。

【実行例】

子階層のデザイン設定

  • 便宜上、当サンプルではデータセットを手動で作成しています。SQL ServerやOracle等との接続に関する一般的な手法については各種参考文献をご参照ください。
  • 最終的なデータベースへの反映はADO.NETによるUpdateメソッド等の呼び出しを行う必要があります。また、テーブルの排他制御等についてもADO.NETの仕様に基づき適切に行う必要があります。詳細についてはMSDNライブラリをご参照ください。
  • DataRowのRowStateはセルデータの変更だけでは更新(Modified)されず、標準のDataGridViewコントロールと同様、アクティブセルが他の行に移動したタイミングで更新されます。
  • SPREADは実行時、データセットと連結されたタイミングで子階層のデータを取得するため、 デザイン時に子階層の各スタイルを設定することはできません。子階層のスタイル設定は子ビューが作成されたときに発生する ChildViewCreatedイベント内にて行う必要があります。
  • ChildViewCreatedイベントはマウスクリックによる手動展開、または SheetViewクラスのExpandRowメソッド呼び出しによる自動展開のいずれかが行われた場合のみ発生します。(子ビューを取得するGetChildViewメソッド呼び出し時には発生しません)
  • 一度の印刷(PrintSheetメソッド呼び出し)で出力されるのは親ビューのみ、または 指定した一つの子ビューのみです。展開表示されているイメージのまま印刷することはできません。
  • 各ファイル(xls形式など)へ出力されるデータは常に親階層のみとなります。
  • 固定行に設定した親行では、子階層を展開させることができません。
  • データ連結時には関連データベースフィールドのデータに基づき、列のサイズ(幅)が自動的に設定されます。また、 列のセル型列ヘッダのテキストも自動的に変更されます。

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

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

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

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

   //データセットを手動で作成します
   DataSet ds = new DataSet();
   DataTable fpParent;
   DataTable fpChild1;

   fpParent = ds.Tables.Add("SampleTable");
   fpParent.Columns.AddRange(new DataColumn[] {
               new DataColumn("Name", Type.GetType("System.String")),
               new DataColumn("ID", Type.GetType("System.Int32"))});

   fpParent.Rows.Add(new object[] {"親データ1", 123});
   fpParent.Rows.Add(new object[] {"親データ2", 456});

   fpChild1 = ds.Tables.Add("ChildTable");
   fpChild1.Columns.AddRange(new DataColumn[] {
               new DataColumn("Child-Name", Type.GetType("System.String")),
               new DataColumn("ID", Type.GetType("System.Int32"))});

   fpChild1.Rows.Add(new object[] {"子データ1-1", 123});
   fpChild1.Rows.Add(new object[] {"子データ1-2", 123});

   fpChild1.Rows.Add(new object[] {"子データ2-1", 456});
   fpChild1.Rows.Add(new object[] {"子データ2-2", 456});

   //テーブル間のリレーションを設定します
   ds.Relations.Add("Relation1", fpParent.Columns["ID"], fpChild1.Columns["ID"]);

   //作成されたデータセットを接続します
   fpSpread1.ActiveSheet.DataSource = ds;

   //全ての階層を展開します
   fpSpread1.ActiveSheet.ExpandRow(-1, true);

 }

 //子ビューの各デザインは当イベントにて設定します(e.SheetView:作成された子ビュー)
 private void fpSpread1_ChildViewCreated(object sender, FarPoint.Win.Spread.ChildViewCreatedEventArgs e)
 {

   //行および列ヘッダの背景色を設定します
   e.SheetView.AlternatingRows[0].BackColor = Color.LightCyan;
   e.SheetView.AlternatingRows[1].BackColor = Color.LightPink;
   e.SheetView.ColumnHeader.Rows[0].BackColor = Color.LemonChiffon;

   //行ヘッダを非表示とします
   e.SheetView.RowHeader.Visible = false;

   //列幅の自動設定を無効とします
   e.SheetView.DataAutoSizeColumns = false;
   //列幅を変更します
   e.SheetView.SetColumnWidth(0, 120);
   e.SheetView.SetColumnWidth(1, 180);

   //固定列/行を設定します
   e.SheetView.FrozenColumnCount = 1;
   e.SheetView.FrozenRowCount = 1;

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

   'データセットを作成します
   Dim ds As New DataSet
   Dim fpParent As DataTable
   Dim fpChild1 As DataTable

   fpParent = ds.Tables.Add("SampleTable")
   fpParent.Columns.AddRange(New DataColumn() { _
               New DataColumn("Name", Type.GetType("System.String")), _
               New DataColumn("ID", Type.GetType("System.Int32"))})

   fpParent.Rows.Add(New Object() {"親データ1", 123})
   fpParent.Rows.Add(New Object() {"親データ2", 456})

   fpChild1 = ds.Tables.Add("ChildTable")
   fpChild1.Columns.AddRange(New DataColumn() { _
               New DataColumn("Child-Name", Type.GetType("System.String")), _
               New DataColumn("ID", Type.GetType("System.Int32"))})

   fpChild1.Rows.Add(New Object() {"子データ1-1", 123})
   fpChild1.Rows.Add(New Object() {"子データ1-2", 123})

   fpChild1.Rows.Add(New Object() {"子データ2-1", 456})
   fpChild1.Rows.Add(New Object() {"子データ2-2", 456})

   'テーブル間のリレーションを設定します
   ds.Relations.Add("Relation1", fpParent.Columns("ID"), fpChild1.Columns("ID"))

   '作成されたデータセットを接続します
   FpSpread1.ActiveSheet.DataSource = ds

   '全ての階層を展開します
   FpSpread1.ActiveSheet.ExpandRow(-1, True)

 End Sub

 '子ビューの各デザインは当イベントにて設定します(e.SheetView:作成された子ビュー)
 Private Sub FpSpread1_ChildViewCreated(ByVal sender As Object, ByVal e As FarPoint.Win.Spread.ChildViewCreatedEventArgs) Handles FpSpread1.ChildViewCreated

   '行および列ヘッダの背景色を設定します
   e.SheetView.AlternatingRows(0).BackColor = Color.LightCyan
   e.SheetView.AlternatingRows(1).BackColor = Color.LightPink
   e.SheetView.ColumnHeader.Rows(0).BackColor = Color.LemonChiffon

   '行ヘッダを非表示とします
   e.SheetView.RowHeader.Visible = False

   '列幅の自動設定を無効とします
   e.SheetView.DataAutoSizeColumns = False
   '列幅を変更します
   e.SheetView.SetColumnWidth(0, 120)
   e.SheetView.SetColumnWidth(1, 180)

   '固定列/行を設定します
   e.SheetView.FrozenColumnCount = 1
   e.SheetView.FrozenRowCount = 1

 End Sub

 

 


Copyright © 2004 GrapeCity inc.