階層表示で親階層と子階層の水平スクロールを同期させたい
対象製品
SPREAD for Windows Forms 5.0J
詳細
層表示の親子のスクロールを同期させるには、LeftChangeイベントを利用し
SetViewportLeftColumnメソッドを実行する方法が考えられます。
また、下記のサンプルコードはChildWorkbookCreatedイベントとExpandイベントを利用し、
子階層が展開された時点でも親階層と同期するようにしています。
【VB サンプルコード】
【C# サンプルコード】
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
' データセットを作成します。
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);
}
}
{
// データセットを作成します。
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);
}
}
関連情報
- 異なるSPREAD間で数式を設定出来ますか?
- 【Tips】異なるSPREAD間で列幅の同期を実装する方法
- 複数シート間でのスクロール同期を実装する方法 (シート上にて表示されている先頭行/列が変更されたタイミングの取得)
キーワード
「同期」
この文書は、以前は次のFAQ IDで公開されていました : 13020