MESCIUS SPREAD for Windows Forms 17.0J サンプルコード集 > データ連結(階層表示) > 任意のタイミングによるアクティブセルの移動 (親階層セル ⇒ 子階層セル) |
階層表示されている場合、親階層(親ビュー)と子階層(子ビュー)はそれぞれが独立したオブジェクトとして存在しています。通常、シート上のアクティブセルインデックスはSheetViewクラスのActiveRowIndexプロパティ(行)およびActiveColumnIndexプロパティ(列)にて取得することができますが、階層表示時に取得されるのは 親階層のインデックスとなることに注意が必要です。
FpSpread1.ActiveSheet.ActiveRowIndex
FpSpread1.ActiveSheet.ActiveColumnIndex
また、アクティブセルを移動させるには同クラスのSetActiveCellメソッド呼び出しを行いますが、以下のコードを実行した場合、移動は 親階層上でのみ行われ、また 子階層上のセルがアクティブな状態では親階層上のセルをアクティブにすることができません。これは先述のとおり、お互いが独立したオブジェクトとして存在することに起因します。
FpSpread1.ActiveSheet.SetActiveCell(0,0)
そのため、例えば任意のタイミングで親階層上に存在するアクティブセルを子階層上に移動させるには特別な処理が必要です。具体的な実装方法については以下のサンプルをご参照いただくとして、大まかな処理手順は次のようになります。(実際にはプロジェクトの仕様に基づいた独自のカスタマイズが必要です)
|
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