作成日: 2019/01/24 最終更新日: 2019/01/24
文書種別
使用方法
詳細
C1FlexGridでは、GridTreeクラスを使用してデータを階層的にグループ化し、折りたたみ可能なツリーとして表示できます(Microsoft TreeViewコントロールと同様な表示)。
このツリー表示において、各ツリーノードにCheckBoxを表示し、親ノードのチェックのON/OFFを切り替えたときに、それに伴ってすべての子ノードのチェックのON/OFFを切り替える方法をご紹介します。これを行うには、 C1FlexgridのCellCheckedイベント内で次の手順を実行します。
1. ON/OFFを切り替えた親ノードの下の子ノード数を取得
2. 子ノード数が0より大きい場合、子ノードのセル範囲オブジェクトを作成
3. 親ノードのチェック状態を取得
4. 子ノードのチェック状態を親ノードに合わせてすべて変更
◎サンプルコード(VB)
◎サンプルコード(C#)
このツリー表示において、各ツリーノードにCheckBoxを表示し、親ノードのチェックのON/OFFを切り替えたときに、それに伴ってすべての子ノードのチェックのON/OFFを切り替える方法をご紹介します。これを行うには、 C1FlexgridのCellCheckedイベント内で次の手順を実行します。
1. ON/OFFを切り替えた親ノードの下の子ノード数を取得
2. 子ノード数が0より大きい場合、子ノードのセル範囲オブジェクトを作成
3. 親ノードのチェック状態を取得
4. 子ノードのチェック状態を親ノードに合わせてすべて変更
◎サンプルコード(VB)
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
' テスト用ノードの作成
C1FlexGrid1.Cols(0).Width = 30
C1FlexGrid1.Cols.Count = 2
C1FlexGrid1.ExtendLastCol = True
C1FlexGrid1.Tree.Column = 1
Dim r As Random = New Random
Dim s() As String = "Iron|Steel|Titanium|Gold|Silver|Platinum|Copper|Zinc|Bronze".Split(Microsoft.VisualBasic.ChrW(124))
Dim level As Integer = 0
C1FlexGrid1.Rows.Count = 1
Dim i As Integer
For i = 1 To 1000
' 新規ノードを追加
C1FlexGrid1.Rows.InsertNode(i, level)
C1FlexGrid1(i, 1) = s(r.Next(s.Length - 1)) + " " + (i).ToString
If r.NextDouble() > 0.5 Then
C1FlexGrid1.SetCellCheck(i, 1, CheckEnum.Checked)
Else
C1FlexGrid1.SetCellCheck(i, 1, CheckEnum.Unchecked)
End If
If level > 0 And r.NextDouble() > 0.75 Then
level = level - 1
ElseIf level = 0 Or r.NextDouble() > 0.8 Then
level = level + 1
End If
Next
End Sub
Private Sub C1FlexGrid1_CellChecked(sender As Object, e As C1.Win.C1FlexGrid.RowColEventArgs) Handles C1FlexGrid1.CellChecked
' チェックしたノードの子ノード数を取得
Dim children As Integer = C1FlexGrid1.Rows(e.Row).Node.Children
' チェックしたノードが子ノードを持つ場合、以下の手順を実行
Dim firstRow, lastRow As Integer
If (children > 0) Then
' チェックしたノードのセル範囲オブジェクトを作成
Dim cr As CellRange = C1FlexGrid1.Rows(e.Row).Node.GetCellRange
firstRow = cr.r1
lastRow = cr.r2
' チェックしたノードのチェック状態を取得
Dim ck As CheckEnum = C1FlexGrid1.GetCellCheck(e.Row, e.Col)
Dim i As Integer
' 子ノードのチェック状態をすべて変更
For i = firstRow To lastRow
C1FlexGrid1.SetCellCheck(i, e.Col, ck)
Next
End If
End Sub
' テスト用ノードの作成
C1FlexGrid1.Cols(0).Width = 30
C1FlexGrid1.Cols.Count = 2
C1FlexGrid1.ExtendLastCol = True
C1FlexGrid1.Tree.Column = 1
Dim r As Random = New Random
Dim s() As String = "Iron|Steel|Titanium|Gold|Silver|Platinum|Copper|Zinc|Bronze".Split(Microsoft.VisualBasic.ChrW(124))
Dim level As Integer = 0
C1FlexGrid1.Rows.Count = 1
Dim i As Integer
For i = 1 To 1000
' 新規ノードを追加
C1FlexGrid1.Rows.InsertNode(i, level)
C1FlexGrid1(i, 1) = s(r.Next(s.Length - 1)) + " " + (i).ToString
If r.NextDouble() > 0.5 Then
C1FlexGrid1.SetCellCheck(i, 1, CheckEnum.Checked)
Else
C1FlexGrid1.SetCellCheck(i, 1, CheckEnum.Unchecked)
End If
If level > 0 And r.NextDouble() > 0.75 Then
level = level - 1
ElseIf level = 0 Or r.NextDouble() > 0.8 Then
level = level + 1
End If
Next
End Sub
Private Sub C1FlexGrid1_CellChecked(sender As Object, e As C1.Win.C1FlexGrid.RowColEventArgs) Handles C1FlexGrid1.CellChecked
' チェックしたノードの子ノード数を取得
Dim children As Integer = C1FlexGrid1.Rows(e.Row).Node.Children
' チェックしたノードが子ノードを持つ場合、以下の手順を実行
Dim firstRow, lastRow As Integer
If (children > 0) Then
' チェックしたノードのセル範囲オブジェクトを作成
Dim cr As CellRange = C1FlexGrid1.Rows(e.Row).Node.GetCellRange
firstRow = cr.r1
lastRow = cr.r2
' チェックしたノードのチェック状態を取得
Dim ck As CheckEnum = C1FlexGrid1.GetCellCheck(e.Row, e.Col)
Dim i As Integer
' 子ノードのチェック状態をすべて変更
For i = firstRow To lastRow
C1FlexGrid1.SetCellCheck(i, e.Col, ck)
Next
End If
End Sub
◎サンプルコード(C#)
private void Form1_Load(object sender, EventArgs e)
{
// テスト用ノードの作成
c1FlexGrid1.Cols[0].Width = 30;
c1FlexGrid1.Cols.Count = 2;
c1FlexGrid1.ExtendLastCol = true;
c1FlexGrid1.Tree.Column = 1;
Random r = new Random();
string[] s = "Iron|Steel|Titanium|Gold|Silver|Platinum|Copper|Zinc|Bronze".Split('|');
int level = 0;
c1FlexGrid1.Rows.Count = 1;
for (int i = 1; i <= 1000; i++)
{
// 新規ノードを追加
c1FlexGrid1.Rows.InsertNode(i, level);
c1FlexGrid1[i, 1] = s[r.Next(s.Length - 1)] + " " + i.ToString();
c1FlexGrid1.SetCellCheck(i, 1, (r.NextDouble() > .5) ? CheckEnum.Checked : CheckEnum.Unchecked);
if (level > 0 && r.NextDouble() > .75) level--;
else if (level == 0 || r.NextDouble() > .8) level++;
}
}
private void c1FlexGrid1_CellChecked(object sender, RowColEventArgs e)
{
// チェックしたノードの子ノード数を取得
int children = c1FlexGrid1.Rows[e.Row].Node.Children;
// チェックしたノードが子ノードを持つ場合、以下の手順を実行
int firstRow, lastRow;
if (children > 0)
{
// チェックしたノードのセル範囲オブジェクトを作成
CellRange cr = c1FlexGrid1.Rows[e.Row].Node.GetCellRange();
firstRow = cr.r1;
lastRow = cr.r2;
// チェックしたノードのチェック状態を取得
CheckEnum ck = c1FlexGrid1.GetCellCheck(e.Row, e.Col);
// 子ノードのチェック状態をすべて変更
for (int i = firstRow; i <= lastRow; i++)
{
c1FlexGrid1.SetCellCheck(i, e.Col, ck);
}
}
}
{
// テスト用ノードの作成
c1FlexGrid1.Cols[0].Width = 30;
c1FlexGrid1.Cols.Count = 2;
c1FlexGrid1.ExtendLastCol = true;
c1FlexGrid1.Tree.Column = 1;
Random r = new Random();
string[] s = "Iron|Steel|Titanium|Gold|Silver|Platinum|Copper|Zinc|Bronze".Split('|');
int level = 0;
c1FlexGrid1.Rows.Count = 1;
for (int i = 1; i <= 1000; i++)
{
// 新規ノードを追加
c1FlexGrid1.Rows.InsertNode(i, level);
c1FlexGrid1[i, 1] = s[r.Next(s.Length - 1)] + " " + i.ToString();
c1FlexGrid1.SetCellCheck(i, 1, (r.NextDouble() > .5) ? CheckEnum.Checked : CheckEnum.Unchecked);
if (level > 0 && r.NextDouble() > .75) level--;
else if (level == 0 || r.NextDouble() > .8) level++;
}
}
private void c1FlexGrid1_CellChecked(object sender, RowColEventArgs e)
{
// チェックしたノードの子ノード数を取得
int children = c1FlexGrid1.Rows[e.Row].Node.Children;
// チェックしたノードが子ノードを持つ場合、以下の手順を実行
int firstRow, lastRow;
if (children > 0)
{
// チェックしたノードのセル範囲オブジェクトを作成
CellRange cr = c1FlexGrid1.Rows[e.Row].Node.GetCellRange();
firstRow = cr.r1;
lastRow = cr.r2;
// チェックしたノードのチェック状態を取得
CheckEnum ck = c1FlexGrid1.GetCellCheck(e.Row, e.Col);
// 子ノードのチェック状態をすべて変更
for (int i = firstRow; i <= lastRow; i++)
{
c1FlexGrid1.SetCellCheck(i, e.Col, ck);
}
}
}
関連情報
旧文書番号
83564