MESCIUS SPREAD for Windows Forms 17.0J サンプルコード集
任意のタイミングによるアクティブセルの移動 (親階層セル ⇒ 子階層セル)

階層表示されている場合、親階層(親ビュー)と子階層(子ビュー)はそれぞれが独立したオブジェクトとして存在しています。通常、シート上のアクティブセルインデックスはSheetViewクラスのActiveRowIndexプロパティ(行)およびActiveColumnIndexプロパティ(列)にて取得することができますが、階層表示時に取得されるのは 親階層のインデックスとなることに注意が必要です。

       FpSpread1.ActiveSheet.ActiveRowIndex
       FpSpread1.ActiveSheet.ActiveColumnIndex

また、アクティブセルを移動させるには同クラスのSetActiveCellメソッド呼び出しを行いますが、以下のコードを実行した場合、移動は 親階層上でのみ行われ、また 子階層上のセルがアクティブな状態では親階層上のセルをアクティブにすることができません。これは先述のとおり、お互いが独立したオブジェクトとして存在することに起因します。

        FpSpread1.ActiveSheet.SetActiveCell(0,0)

そのため、例えば任意のタイミングで親階層上に存在するアクティブセルを子階層上に移動させるには特別な処理が必要です。具体的な実装方法については以下のサンプルをご参照いただくとして、大まかな処理手順は次のようになります。(実際にはプロジェクトの仕様に基づいた独自のカスタマイズが必要です)

【処理手順】

  1. アクティブな親階層の行に関連付けられている子階層のワークブックを取得します
  2. 取得した子ワークブックをアクティブにします
  3. 子ワークブックのシート上のセルをアクティブにします

【実行例】 親階層上にアクティブセルが存在

親階層アクティブ

子階層上にアクティブセルを移動

子階層アクティブ

  • 異なる子階層上のセルをクリックした場合でも、親階層上におけるアクティブセルインデックスは変更されません。(前回のインデックスが保持されています)
  • 便宜上、当サンプルではデータセットを手動で作成しています。SQL ServerやOracle等との接続に関する一般的な手法については各種参考文献をご参照ください。
  • 最終的なデータベースへの反映はADO.NETによるUpdateメソッド等の呼び出しを行う必要があります。また、テーブルの排他制御等についてもADO.NETの仕様に基づき適切に行う必要があります。詳細についてはMSDNライブラリをご参照ください。
  • DataRowのRowStateはセルデータの変更だけでは更新(Modified)されず、標準のDataGridViewコントロールと同様、アクティブセルが他の行に移動したタイミングで更新されます。
 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});

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

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

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

   fpSpread1.FocusRenderer = new FarPoint.Win.Spread.SolidFocusIndicatorRenderer(Color.Red, 2);
   fpSpread1.HorizontalScrollBarPolicy = FarPoint.Win.Spread.ScrollBarPolicy.Never;
   fpSpread1.VerticalScrollBarPolicy = FarPoint.Win.Spread.ScrollBarPolicy.Never;

 }

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

   FarPoint.Win.Spread.SpreadView ChildView;

   //親ワークブック上のアクティブ行が階層展開されている場合のみ
   if (fpSpread1.ActiveSheet.IsRowExpanded(fpSpread1.ActiveSheet.ActiveRowIndex) == true)
   {

      //(1)親ワークブック上のアクティブ行インデックスに関連付けられている子ワークブックを取得します
      ChildView = fpSpread1.GetRootWorkbook().GetSpreadView(fpSpread1.ActiveSheet.GetChildView(fpSpread1.ActiveSheet.ActiveRowIndex, 0), 0, 0);

      //(2)子ワークブックをアクティブにします
      fpSpread1.GetRootWorkbook().SetActiveWorkbook(ChildView);

      //(3)子ワークブック上のセルをアクティブにします
      fpSpread1.GetRootWorkbook().Sheets[0].ClearSelection();
      ChildView.Sheets[0].SetActiveCell(0, 0);
      fpSpread1.GetRootWorkbook().Invalidate();
      ChildView.Invalidate();

   }

 }

 private void fpSpread1_ChildWorkbookCreated(object sender, FarPoint.Win.Spread.ChildWorkbookCreatedEventArgs e)
 {

   //子ワークブックのデザインを設定します(当手法に直接的な関係はありません)
   e.Workbook.FocusRenderer = new FarPoint.Win.Spread.SolidFocusIndicatorRenderer(Color.Red, 2);
   e.Workbook.HorizontalScrollBarPolicy = FarPoint.Win.Spread.ScrollBarPolicy.Never;
   e.Workbook.VerticalScrollBarPolicy = FarPoint.Win.Spread.ScrollBarPolicy.Never;

 }
 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})

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

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

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

   FpSpread1.FocusRenderer = New FarPoint.Win.Spread.SolidFocusIndicatorRenderer(Color.Red, 2)    FpSpread1.HorizontalScrollBarPolicy = FarPoint.Win.Spread.ScrollBarPolicy.Never
   FpSpread1.VerticalScrollBarPolicy = FarPoint.Win.Spread.ScrollBarPolicy.Never

 End Sub

 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

   Dim ChildView As FarPoint.Win.Spread.SpreadView

   '親ワークブック上のアクティブ行が階層展開されている場合のみ
   If FpSpread1.ActiveSheet.IsRowExpanded(FpSpread1.ActiveSheet.ActiveRowIndex) Then

      '(1)親ワークブック上のアクティブ行インデックスに関連付けられている子ワークブックを取得します
      ChildView = FpSpread1.GetRootWorkbook.GetSpreadView(FpSpread1.ActiveSheet.GetChildView(FpSpread1.ActiveSheet.ActiveRowIndex, 0), 0, 0)

      '(2)子ワークブックをアクティブにします
      FpSpread1.GetRootWorkbook.SetActiveWorkbook(ChildView)

      '(3)子ワークブック上のセルをアクティブにします
      FpSpread1.GetRootWorkbook.Sheets(0).ClearSelection()
      ChildView.Sheets(0).SetActiveCell(0, 0)
      FpSpread1.GetRootWorkbook.Invalidate()
      ChildView.Invalidate()

   End If

 End Sub

 Private Sub FpSpread1_ChildWorkbookCreated(ByVal sender As Object, ByVal e As FarPoint.Win.Spread.ChildWorkbookCreatedEventArgs) Handles FpSpread1.ChildWorkbookCreated

   '子ワークブックのデザインを設定します(当手法に直接的な関係はありません)
   e.Workbook.FocusRenderer = New FarPoint.Win.Spread.SolidFocusIndicatorRenderer(Color.Red, 2)
   e.Workbook.HorizontalScrollBarPolicy = FarPoint.Win.Spread.ScrollBarPolicy.Never
   e.Workbook.VerticalScrollBarPolicy = FarPoint.Win.Spread.ScrollBarPolicy.Never

 End Sub

 

 


© MESCIUS inc. All rights reserved.