階層表示で親階層と子階層の水平スクロールを同期させたい

文書番号 : 28843     文書種別 : 使用方法     最終更新日 : 2010/04/02
文書を印刷する
対象製品
SPREAD for Windows Forms 5.0J
詳細
層表示の親子のスクロールを同期させるには、LeftChangeイベントを利用し
SetViewportLeftColumnメソッドを実行する方法が考えられます。

また、下記のサンプルコードはChildWorkbookCreatedイベントとExpandイベントを利用し、
子階層が展開された時点でも親階層と同期するようにしています。

【VB サンプルコード】
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  ' データセットを作成します。
  Dim ds As DataSet = New DataSet
  ds.EnforceConstraints = False
  
  ' Parentテーブルを定義してデータを設定します。
  Dim parent As DataTable = ds.Tables.Add("Parent")
  parent.DefaultView.AllowNew = False
  parent.Columns.Add(New DataColumn("P-A", Type.GetType("System.String")))
  parent.Columns.Add(New DataColumn("P-B", Type.GetType("System.String")))
  parent.Columns.Add(New DataColumn("P-C", Type.GetType("System.Int32")))
  parent.Rows.Add(New Object() {"AAA", "aaa", 0})
  parent.Rows.Add(New Object() {"BBB", "bbb", 1})
  parent.Rows.Add(New Object() {"CCC", "ccc", 2})
  parent.Rows.Add(New Object() {"DDD", "ddd", 3})
   ' Childテーブルを定義してデータを設定します。
  Dim child As DataTable = ds.Tables.Add("Child")
  child.DefaultView.AllowNew = False
  child.Columns.Add(New DataColumn("C-A", Type.GetType("System.String")))
  child.Columns.Add(New DataColumn("C-B", Type.GetType("System.Int32")))
  child.Columns.Add(New DataColumn("C-C", Type.GetType("System.Int32")))
  child.Rows.Add(New Object() {"C-AAA", 101, 0})
  child.Rows.Add(New Object() {"C-BBB", 102, 0})
  child.Rows.Add(New Object() {"C-CCC", 103, 0})
  child.Rows.Add(New Object() {"C-DDD", 201, 1})
  child.Rows.Add(New Object() {"C-EEE", 202, 1})
  child.Rows.Add(New Object() {"C-FFF", 301, 2})
  child.Rows.Add(New Object() {"C-GGG", 302, 2})
  child.Rows.Add(New Object() {"C-HHH", 401, 3})
  child.Rows.Add(New Object() {"C-III", 402, 3})
   ' テーブル間にリレーションシップを追加します。
  ds.Relations.Add("PCRelation", parent.Columns("P-C"), child.Columns("C-C"))
   ' SPREADの設定
  FpSpread1.ActiveSheet.DataMember = "Parent"
  FpSpread1.ActiveSheet.DataSource = ds
  FpSpread1.ActiveSheet.SetColumnWidth(0, 80)
  FpSpread1.ActiveSheet.SetColumnWidth(1, 70)
  FpSpread1.ActiveSheet.SetColumnWidth(2, 60)
End Sub

Private Sub FpSpread1_ChildViewCreated(ByVal sender As Object, ByVal e As FarPoint.Win.Spread.ChildViewCreatedEventArgs) Handles FpSpread1.ChildViewCreated
  ' 子シートビューの列幅を設定します。
  e.SheetView.RowHeader.Visible = False
  e.SheetView.SetColumnWidth(0, FpSpread1.ActiveSheet.Columns(0).Width)
  e.SheetView.SetColumnWidth(1, FpSpread1.ActiveSheet.Columns(1).Width)
  e.SheetView.SetColumnWidth(2, FpSpread1.ActiveSheet.Columns(2).Width)
End Sub

Private Sub FpSpread1_ChildWorkbookCreated(ByVal sender As Object, ByVal e As FarPoint.Win.Spread.ChildWorkbookCreatedEventArgs) Handles FpSpread1.ChildWorkbookCreated
  ' 親シートの状態に合わせて子シートをスクロールします。
  ScrollChild(FpSpread1.GetViewportLeftColumn(0))
End Sub

Private Sub FpSpread1_Expand(ByVal sender As Object, ByVal e As FarPoint.Win.Spread.ExpandEventArgs) Handles FpSpread1.Expand
  If e.Expand Then
    ' 親シートの状態に合わせて子シートをスクロールします。
    ScrollChild(e.View.GetViewportLeftColumn(0))
  End If
End Sub

Private Sub FpSpread1_LeftChange(ByVal sender As Object, ByVal e As FarPoint.Win.Spread.LeftChangeEventArgs) Handles FpSpread1.LeftChange
  ' 子シートビューのスクロールに応じて親シートをスクロールします。
  FpSpread1.SetViewportLeftColumn(0, e.NewLeft)
  ' スクロールに応じて子シートをスクロールします。
  ScrollChild(e.NewLeft)
End Sub

'''
''' 子シートのスクロール
'''

''' スクロール後の左端の列
Private Sub ScrollChild(ByVal col As Integer)
  Dim childs As New ArrayList()
  childs = FpSpread1.GetRootWorkbook().GetChildWorkbooks()
  For Each sv As FarPoint.Win.Spread.SpreadView In childs
    sv.SetViewportLeftColumn(0, col)
  Next
End Sub


【C# サンプルコード】
private void Form1_Load(object sender, EventArgs e)
{
  // データセットを作成します。
  DataSet ds = new DataSet();
  ds.EnforceConstraints = false;
  // Parentテーブルを定義してデータを設定します。
  DataTable parent = ds.Tables.Add("Parent");
  parent.DefaultView.AllowNew = false;
  parent.Columns.Add(new DataColumn("P-A", Type.GetType("System.String")));
  parent.Columns.Add(new DataColumn("P-B", Type.GetType("System.String")));
  parent.Columns.Add(new DataColumn("P-C", Type.GetType("System.Int32")));
  parent.Rows.Add(new object[] { "AAA", "aaa", 0 });
  parent.Rows.Add(new object[] { "BBB", "bbb", 1 });
  parent.Rows.Add(new object[] { "CCC", "ccc", 2 });
  parent.Rows.Add(new object[] { "DDD", "ddd", 3 });
  // Childテーブルを定義してデータを設定します。
  DataTable child = ds.Tables.Add("Child");
  child.DefaultView.AllowNew = false;
  child.Columns.Add(new DataColumn("C-A", Type.GetType("System.String")));
  child.Columns.Add(new DataColumn("C-B", Type.GetType("System.Int32")));
  child.Columns.Add(new DataColumn("C-C", Type.GetType("System.Int32")));
  child.Rows.Add(new object[] { "C-AAA", 101, 0 });
  child.Rows.Add(new object[] { "C-BBB", 102, 0 });
  child.Rows.Add(new object[] { "C-CCC", 103, 0 });
  child.Rows.Add(new object[] { "C-DDD", 201, 1 });
  child.Rows.Add(new object[] { "C-EEE", 202, 1 });
  child.Rows.Add(new object[] { "C-FFF", 301, 2 });
  child.Rows.Add(new object[] { "C-GGG", 302, 2 });
  child.Rows.Add(new object[] { "C-HHH", 401, 3 });
  child.Rows.Add(new object[] { "C-III", 402, 3 });
  // テーブル間にリレーションシップを追加します。
  ds.Relations.Add("PCRelation", parent.Columns["P-C"], child.Columns["C-C"]);
  // SPREADの設定
  FpSpread1.ActiveSheet.DataMember = "Parent";
  FpSpread1.ActiveSheet.DataSource = ds;
  FpSpread1.ActiveSheet.SetColumnWidth(0, 80);
  FpSpread1.ActiveSheet.SetColumnWidth(1, 70);
  FpSpread1.ActiveSheet.SetColumnWidth(2, 60);
}
private void FpSpread1_ChildViewCreated(object sender, FarPoint.Win.Spread.ChildViewCreatedEventArgs e)
{
  // 子シートビューの列幅を設定します。
  e.SheetView.RowHeader.Visible = false;
  e.SheetView.SetColumnWidth(0, (int)FpSpread1.ActiveSheet.Columns[0].Width);
  e.SheetView.SetColumnWidth(1, (int)FpSpread1.ActiveSheet.Columns[1].Width);
  e.SheetView.SetColumnWidth(2, (int)FpSpread1.ActiveSheet.Columns[2].Width);
}
private void FpSpread1_ChildWorkbookCreated(object sender, FarPoint.Win.Spread.ChildWorkbookCreatedEventArgs e)
{
  // 親シートの状態に合わせて子シートをスクロールします。
  ScrollChild(FpSpread1.GetViewportLeftColumn(0));
}
private void FpSpread1_Expand(object sender, FarPoint.Win.Spread.ExpandEventArgs e)
{
  if (e.Expand)
  {
    // 親シートの状態に合わせて子シートをスクロールします。
    ScrollChild(e.View.GetViewportLeftColumn(0));
  }
}
private void FpSpread1_LeftChange(object sender, FarPoint.Win.Spread.LeftChangeEventArgs e)
{
  // 子シートビューのスクロールに応じて親シートをスクロールします。
  FpSpread1.SetViewportLeftColumn(0, e.NewLeft);
  // スクロールに応じて子シートをスクロールします。
  ScrollChild(e.NewLeft);
}
///
/// 子シートのスクロール
///

/// スクロール後の左端の列
private void ScrollChild(int col)
{
  System.Collections.ArrayList childs = new System.Collections.ArrayList();
  childs = FpSpread1.GetRootWorkbook().GetChildWorkbooks();
  foreach (FarPoint.Win.Spread.SpreadView sv in childs)
  {
    sv.SetViewportLeftColumn(0, col);
  }
}
関連情報
キーワード
「同期」

この文書は、以前は次のFAQ IDで公開されていました : 13020