FlexGrid for WinForms
ツリーグリッド

概要

FlexGrid コントロールでよく使用される独自の機能の 1 つとして、通常のデータグリッドに階層的なグループ化を追加して、ツリーグリッドというツリー形式の構造を表示することができます。 ツリーグリッドコントロールの外観は、TreeView コントロールとよく似ています。各ノード行の横に折りたたみ/展開アイコンがインデント形式の構造として表示されます。ユーザーは、ノードをクリックすることでアウトラインを展開したり折りたたんで、任意の詳細レベルを表示できます。 

FlexGrid のグループ化機能を使用すれば簡単なアウトラインツリーを作成できますが、ツリーグリッドでは、顧客や注文の詳細を表示するなどのより高度なユースケースを実装できます。 このようなデータを通常のグリッドで表示すると、各顧客や注文の詳細を表示することは困難です。そのような場合に、ツリーグリッドを作成してデータを階層構造にグループ化すると、情報へのアクセスと表示が容易になります。

ツリーグリッド

クイック連結

ツリーグリッドへのデータのロード方法は、標準グリッドへのロード方法とまったく同じです。設計時にデータソースを使用できる場合は、Visual Studio のプロパティウィンドウを使用すると、コードを 1 行も書かずに、C1FlexGrid クラスの DataSource プロパティをグリッドに設定して、グリッドをデータに連結できます。詳細な手順については、「連結モード」を参照してください。

コードを使用して DataSource プロパティを設定することもできます。次のコードは、DataSource プロパティを使用して WinForms ツリーグリッドにデータを挿入する方法を示しています。

private void Bound_Node_Load(object sender, EventArgs e)
{
  // FlexGridを連結します
   BindGrid(_gridBound);
}
public void BindGrid(C1FlexGrid grid)
{
   DataTable _dt = new DataTable();
   // データを取得します
   var fields = @" Country, City, SalesPerson, Quantity, ExtendedPrice";
   var sql = string.Format("SELECT {0} FROM Invoices ORDER BY {0}", fields);
   var da = new OleDbDataAdapter(sql, GetConnectionString());
   da.Fill(_dt);
   // グリッドにデータを連結します
   grid.DataSource = _dt;
   // ExtendedPrice 列を書式設定します
   grid.Cols["ExtendedPrice"].Format = "n2";
}
static string GetConnectionString()
{
   string path = Environment.GetFolderPath(Environment.SpecialFolder.Personal) + @"\ComponentOne Samples\Common";
   string conn = @"provider=microsoft.jet.oledb.4.0;data source={0}\c1nwind.mdb;";
   return string.Format(conn, path);
}               
Private Sub Bound_Node_Load(ByVal sender As Object, ByVal e As EventArgs)
        ' FlexGridを連結します
        BindGrid(_gridBound)
    End Sub
    Public Sub BindGrid(ByVal grid As C1FlexGrid)
        Dim _dt As DataTable = New DataTable()
        ' データを取得します
        Dim fields = " Country, City, SalesPerson, Quantity, ExtendedPrice"
        Dim sql = String.Format("SELECT {0} FROM Invoices ORDER BY {0}", fields)
        Dim da = New OleDbDataAdapter(sql, GetConnectionString())
        da.Fill(_dt)
        ' グリッドにデータを連結します
        grid.DataSource = _dt
        ' ExtendedPrice 列を書式設定します
        grid.Cols("ExtendedPrice").Format = "n2"
    End Sub
    Private Shared Function GetConnectionString() As String
        Dim path As String = Environment.GetFolderPath(Environment.SpecialFolder.Personal) & "\ComponentOne Samples\Common"
        Dim conn As String = "provider=microsoft.jet.oledb.4.0;data source={0}\c1nwind.mdb;"
        Return String.Format(conn, path)
    End Function

このコードでは、OleDbDataAdapter を使用して DataTable にデータを挿入し、次に DataTable をグリッドの DataSource プロパティに割り当てています。この標準グリッドをツリーグリッドにするには、次のセクションで説明するノード行を挿入する必要があります。

ノードの作成(連結および非連結モード)

FlexGrid では、ツリーグリッドを作成するために、ノード行の概念が導入されています。ノード行は通常のデータを含まない単なるヘッダー行ですが、ノード行の下に、通常の TreeView コントロールのノードとまったく同様に、類似するデータがグループ化されます。Level プロパティを設定することで、ノードの階層を定義することもできます。ノードを折りたたんだり展開して、ノードに含まれるデータの表示/非表示を切り替えることができます。 ツリーグリッドは、GridTree.Column プロパティで定義される任意の列に表示できます。デフォルトでは、このプロパティは -1 に設定され、ツリーは何も表示されません。

連結モード(InsertNode メソッドを使用)

ノード行は、RowCollection クラスの InsertNode メソッドを使用して作成できます。このメソッドは、新しいノード行を、指定されたインデックスに挿入します。これは、合計を挿入し、アウトラインを構築するための「低レベル」な方法です。

連結モードでのノード作成

ここで使用されている GroupBy メソッドは、同じ値をグループ化することでノード行を挿入します。Node オブジェクトを取得するには、InsertNode メソッドの戻り値を使用するか、IsNode プロパティを使用して既存の行のノードを取得します。

次のコードを使用すると、連結 WinForms ツリーグリッドで InsertNode メソッドを使用してノードを作成できます。

private void Bound_Node_Load(object sender, EventArgs e)
{
   // FlexGridを取得します
   BindGrid(_gridBound);
   // 連結されたFlexGridにツリーを表示します
   CreateTree(_gridBound);
   GroupBy(_gridBound, "Country", 0);
   GroupBy(_gridBound, "City", 1);
}              
public void CreateTree(C1FlexGrid grid)
{
   grid.Tree.Column = 0;
   grid.Tree.Style = TreeStyleFlags.SimpleLeaf;
   grid.Tree.Show(1);
}
void GroupBy(C1FlexGrid grid, string columnName, int level)
{              
   // レベル0でグループのスタイル設定します
   CellStyle s0 = grid.Styles.Add("Group0");
   s0.BackColor = Color.Gray;
   s0.ForeColor = Color.White;
   s0.Font = new Font(grid.Font, FontStyle.Bold);
   // レベル1でグループのスタイル設定します
   CellStyle s1 = grid.Styles.Add("Group1");
   s1.BackColor = Color.LightGray;
   s1.ForeColor = Color.Black;
          
  object current = null;
  for (int r = grid.Rows.Fixed; r < grid.Rows.Count; r++)
  {
    if (!grid.Rows[r].IsNode)
    {
      var value = grid[r, columnName];
      if (!object.Equals(value, current))
      {
        // 値が変更されました。 ノードを挿入します。
        grid.Rows.InsertNode(r, level);
        if (level == 0)
        grid.Rows[r].Style = s0;
        else if (level == 1)
        grid.Rows[r].Style = s1;
        // 最初のスクロール可能な列にグループ名を表示します
        grid[r, grid.Cols.Fixed] = value;
        // 現在の値を更新します
        current = value;
       }
      }
    }
    grid.AutoSizeCols();
}              
Private Sub Bound_Node_Load(ByVal sender As Object, ByVal e As EventArgs)
    ' FlexGridを取得します
    BindGrid(_gridBound)
    ' 連結されたFlexGridにツリーを表示します
    CreateTree(_gridBound)
    GroupBy(_gridBound, "Country", 0)
    GroupBy(_gridBound, "City", 1)
End Sub
Public Sub CreateTree(ByVal grid As C1FlexGrid)
    grid.Tree.Column = 0
    grid.Tree.Style = TreeStyleFlags.SimpleLeaf
    grid.Tree.Show(1)
End Sub
Private Sub GroupBy(ByVal grid As C1FlexGrid, ByVal columnName As String, ByVal level As Integer)
    ' レベル0でグループのスタイル設定します
    Dim s0 As CellStyle = grid.Styles.Add("Group0")
    s0.BackColor = Color.Gray
    s0.ForeColor = Color.White
    s0.Font = New Font(grid.Font, FontStyle.Bold)
    ' レベル1でグループのスタイル設定します
    Dim s1 As CellStyle = grid.Styles.Add("Group1")
    s1.BackColor = Color.LightGray
    s1.ForeColor = Color.Black
    Dim current As Object = Nothing
    Dim r As Integer = grid.Rows.Fixed
    While r And lt
        grid.Rows.Count
    End While
    r += 1
If True Then
    If Not grid.Rows(r).IsNode Then
        Dim value = grid(r, columnName)
                If Not Object.Equals(value, current) Then
                        ' 値が変更されました。 ノードを挿入します。
                        grid.Rows.InsertNode(r, level)
                        If level = 0 Then
                                grid.Rows(r).Style = s0
                        ElseIf level = 1 Then
                                grid.Rows(r).Style = s1
                        End If
                ' 最初のスクロール可能な列にグループ名を表示します
                grid(r, grid.Cols.Fixed) = value
                ' 現在の値を更新します
                current = value
                End If
    End If
End If              
        grid.AutoSizeCols()
End Sub           

さらに、このコードでは、AutoSizeCols メソッドを呼び出して、ツリーグリッドが収まる列幅を確保しています。最後に、GridTree.Show メソッドを呼び出して、ノードを表示します。

また、Node クラスでは、TreeView オブジェクトモデルに基づいて次のメソッドとプロパティが提供されており、これらを使用してツリーグリッドを管理できます。

次のプロパティおよびメソッドを使用してアウトライン構造を調べることもできます。

連結モード(Subtotal メソッドを使用)

連結モードでノードを作成するもう 1 つの方法は、Subtotal メソッドを使用することです。真に便利なツリーグリッドにするには、ノード行に含まれているデータのサマリー情報をノード行に含める必要があります。

Subtotal メソッドを使用してツリーグリッドを作成すると、小計が自動的に追加されます。このメソッドは、グリッド全体をスキャンして、グリッドデータが変化した位置にノード行とオプションの小計を自動的に挿入します。

これは、合計を挿入し、アウトラインを構築するための「高レベル」な方法です。

Subtotal メソッドを使用した連結モードでのノードの作成

Subtotal メソッドの最初のパラメータは、さまざまな集計値(Sum、Average、Count、Max、Min など)を計算する AggregateEnum 列挙です。次のコードでは、C1FlexGrid クラスの Subtotal メソッドを使用して、連結 WinForms ツリーグリッドでノードを作成しています。

private void SubtotalNode_Bound_Load(object sender, EventArgs e)
{
  // FlexGridを取得します
   BindGrid(_gridBound);
  // shows Tree in Bound FlexGrid
   CreateTree(_gridBound);
  // 連結されたFlexGridに小計を作成します
   CreateSubTotal(_gridBound);
}
public void BindGrid(C1FlexGrid grid)
{
   DataTable dt = new DataTable();
   dt.Columns.Add("ID", typeof(int));
   dt.Columns.Add("Name", typeof(string));
   dt.Columns.Add("Course", typeof(string));
   dt.Columns.Add("Score", typeof(int));
   dt.Columns.Add("Attendance", typeof(int));
   dt.Columns.Add("Country", typeof(string));
  
   //サンプルデータ
   dt.Rows.Add(1, "Helen Bennett", "ComputerScience", 79, 84, "Spain");
   dt.Rows.Add(2, "Ana Trujillo", "Biology", 78, 87, "Mexico");
   dt.Rows.Add(3, "Antonio Moreno", "Aeronautics", 71, 70, "Spain");
   dt.Rows.Add(4, "Paolo Accorti", "Biology", 74, 63, "Spain");
   dt.Rows.Add(5, "Elizabeth Brown", "ComputerScience", 80, 93, "Mexico");
   dt.Rows.Add(6, "Jaime Yorres", "Biology", 61, 48, "Spain");
   dt.Rows.Add(7, "Yvonne Moncada", "Aeronautics", 85, 78, "Mexico");
   dt.Rows.Add(8, "Martine Rance", "Aeronautics", 67, 81, "Spain");
   dt.Rows.Add(9, "Sergio Gutierrezy", "ComputerScience", 62, 58, "Mexico");
   dt.Rows.Add(10, "Thomas Hardy", "Aeronautics", 94, 92, "Mexico");
   dt.Rows.Add(11, "Patricio Simpson", "Aeronautics", 46, 52, "Spain");
   dt.Rows.Add(12, "Maria Anders", "ComputerScience", 85, 73, "Spain");
   grid.DataSource = dt;
   grid.AutoSizeCols();
   (grid.DataSource as DataTable).DefaultView.Sort = "Course";
}
    
// FlexGridでツリーを作成します
public void CreateTree(C1FlexGrid grid)
{
   grid.Tree.Column = 1;
   grid.Tree.Style = TreeStyleFlags.SimpleLeaf;
   grid.Tree.Show(1);
   grid.AutoSizeCols();
}
public void CreateSubTotal(C1FlexGrid grid)
{
   // グリッドに存在する既存の小計をすべてクリアします
   grid.Subtotal(AggregateEnum.Clear);
   // レベル:1、グループ:「Course」列、集計(平均):Score、Attendanceでグリッドに小計を追加します
   grid.Subtotal(AggregateEnum.Average, 1, 3, 3, 4, "Average for {0}");
   grid.AutoSizeCols();
}
Private Sub SubtotalNode_Bound_Load(ByVal sender As Object, ByVal e As EventArgs)
    ' FlexGridを取得します
    BindGrid(_gridBound)
' 連結されたFlexGridにツリーを表示します
    CreateTree(_gridBound)
    ' Creates Subtotal(s) in Bound FlexGrid
    CreateSubTotal(_gridBound)
End Sub
Public Sub BindGrid(ByVal grid As C1FlexGrid)
    Dim dt As DataTable = New DataTable()
    dt.Columns.Add("ID", GetType(Integer))
    dt.Columns.Add("Name", GetType(String))
    dt.Columns.Add("Course", GetType(String))
    dt.Columns.Add("Score", GetType(Integer))
    dt.Columns.Add("Attendance", GetType(Integer))
    dt.Columns.Add("Country", GetType(String))
    'サンプルデータ
    dt.Rows.Add(1, "Helen Bennett", "ComputerScience", 79, 84, "Spain")
    dt.Rows.Add(2, "Ana Trujillo", "Biology", 78, 87, "Mexico")
    dt.Rows.Add(3, "Antonio Moreno", "Aeronautics", 71, 70, "Spain")
    dt.Rows.Add(4, "Paolo Accorti", "Biology", 74, 63, "Spain")
    dt.Rows.Add(5, "Elizabeth Brown", "ComputerScience", 80, 93, "Mexico")
    dt.Rows.Add(6, "Jaime Yorres", "Biology", 61, 48, "Spain")
    dt.Rows.Add(7, "Yvonne Moncada", "Aeronautics", 85, 78, "Mexico")
    dt.Rows.Add(8, "Martine Rance", "Aeronautics", 67, 81, "Spain")
    dt.Rows.Add(9, "Sergio Gutierrezy", "ComputerScience", 62, 58, "Mexico")
    dt.Rows.Add(10, "Thomas Hardy", "Aeronautics", 94, 92, "Mexico")
    dt.Rows.Add(11, "Patricio Simpson", "Aeronautics", 46, 52, "Spain")
    dt.Rows.Add(12, "Maria Anders", "ComputerScience", 85, 73, "Spain")
    grid.DataSource = dt
    grid.AutoSizeCols()
    TryCast(grid.DataSource, DataTable).DefaultView.Sort = "Course"
End Sub

' FlexGridでツリーを作成します
Public Sub CreateTree(ByVal grid As C1FlexGrid)
    grid.Tree.Column = 1
    grid.Tree.Style = TreeStyleFlags.SimpleLeaf
    grid.Tree.Show(1)
    grid.AutoSizeCols()
End Sub
Public Sub CreateSubTotal(ByVal grid As C1FlexGrid)
    ' グリッドに存在する既存の小計をすべてクリアします
    grid.Subtotal(AggregateEnum.Clear)
    ' レベル:1、グループ:「Course」列、集計(平均):Score、Attendanceでグリッドに小計を追加します
    grid.Subtotal(AggregateEnum.Average, 1, 3, 3, 4, "Average for {0}")
    grid.AutoSizeCols()
End Sub   

非連結モード(Subtotal メソッドを使用)

Subtotal メソッドは、ツリーグリッドを柔軟に作成できるたいへん便利な方法です。このメソッドには多くのオーバーロードがあり、これらを使用して、どの列をグループ化して合計を計算するかをインデックスまたは名前で指定したり、挿入するノード行にキャプションを含めるかどうか、グループ化をどのように実行するかなどを指定することができます。

Subtotal メソッドを使用した非連結モードでのノードの作成

次のコードでは、C1FlexGrid クラスの Subtotal メソッドを使用して、非連結 WinForms ツリーグリッドでノードを作成しています。

private void Unbound_Subtotal_Load(object sender, EventArgs e)
 {
   // 連結されていないFlexGridにデータを追加します
   PopulateGrid(_gridUnbound);
   // 連結されていないFlexGridにツリーを表示します
   ShowTreeNode(_gridUnbound);
   // 連結されていないFlexGridに小計を作成します
   CreateSubTotal(_gridUnbound);
 }
public void PopulateGrid(C1FlexGrid grid)
{
   // グリッドにデータを入力します
   Random rnd = new Random();
   grid.Rows.Count = 14;
   grid[0, 1] = "Direction";
   grid[0, 2] = "Region";
   CellRange rg = grid.GetCellRange(0, 3, 0, grid.Cols.Count - 1);
   rg.Data = "Rnd";
   for (int r = 1; r < grid.Rows.Count; r++)
   {
     grid[r, 0] = r;
     grid[r, 1] = (r < 7) ? "Inbound" : "Outbound";
     grid[r, 2] = (r < 3) ? "North" : (r < 7) ? "South" : (r < 10) ? "East" : "West";
     for (int c = 3; c < grid.Cols.Count; c++)
     {
       grid[r, c] = rnd.Next(1000);
       grid.Cols[c].Format = "#,###";
     }
    }
    grid.AutoSizeCols();
}
// FlexGridでツリーを作成します
private void ShowTreeNode(C1FlexGrid grid)
{
  // ツリーを作成します
  grid.Tree.Column = 1;
  grid.Tree.Style = TreeStyleFlags.SimpleLeaf;
  grid.AutoSizeCols();
}
// Creates Subtotal in FlexGrid
public void CreateSubTotal(C1FlexGrid grid)
{
   // Clears any existing subtotal(s) present in grid
   grid.Subtotal(AggregateEnum.Clear);
   for (int c = 3; c < grid.Cols.Count; c++)
   {
     // Adds subtotals in grid
     grid.Subtotal(AggregateEnum.Sum, 0, -1, c, "Grand Total");
     grid.Subtotal(AggregateEnum.Sum, 2, 2, c, "Total for {0}");
    }
    grid.AutoSizeCols();
}         
Private Sub Unbound_Subtotal_Load(ByVal sender As Object, ByVal e As EventArgs)
        ' 連結されていないFlexGridにデータを追加します
        PopulateGrid(_gridUnbound)
        ' 連結されていないFlexGridにツリーを表示します
        ShowTreeNode(_gridUnbound)
        ' 連結されていないFlexGridに小計を作成します
        CreateSubTotal(_gridUnbound)
End Sub
Public Sub PopulateGrid(ByVal grid As C1FlexGrid)
    ' グリッドにデータを入力します
    Dim rnd As Random = New Random()
    grid.Rows.Count = 14
    grid(0, 1) = "Direction"
    grid(0, 2) = "Region"
    Dim rg As CellRange = grid.GetCellRange(0, 3, 0, grid.Cols.Count - 1)
    rg.Data = "Rnd"
    For r = 1 To grid.Rows.Count - 1
        grid(r, 0) = r
        grid(r, 1) = If(r < 7, "Inbound", "Outbound")
        grid(r, 2) = If(r < 3, "North", If(r < 7, "South", If(r < 10, "East", "West")))
        For c = 3 To grid.Cols.Count - 1
            grid(r, c) = rnd.[Next](1000)
            grid.Cols(c).Format = "#,###"
        Next
    Next
    grid.AutoSizeCols()End Sub' FlexGridでツリーを作成します
Private Sub ShowTreeNode(ByVal grid As C1FlexGrid)
    ' ツリーを作成しますFlexGridでツリーを作成します
    grid.Tree.Column = 1
    grid.Tree.Style = TreeStyleFlags.SimpleLeaf
    grid.AutoSizeCols()
End Sub
' FlexGridで小計を作成します
Public Sub CreateSubTotal(ByVal grid As C1FlexGrid)
    ' グリッドに存在する既存の小計をすべてクリアします
    grid.Subtotal(AggregateEnum.Clear)
    For c = 3 To grid.Cols.Count - 1
        ' グリッドに小計を追加します
        grid.Subtotal(AggregateEnum.Sum, 0, -1, c, "Grand Total")
        grid.Subtotal(AggregateEnum.Sum, 2, 2, c, "Total for {0}")    Next
    grid.AutoSizeCols()
End Sub

非連結モード(IsNode プロパティを使用)

非連結グリッドでは、IsNode プロパティを true に設定するだけで、通常の行をノード行にすることができます。通常のデータ連結行をノードにしようとすると、例外が生成されます。

非連結モードでの IsNode プロパティを使用したノードの作成

次のコードを使用すると、非連結 WinForms ツリーグリッドで IsNode プロパティを使用してノードを作成できます。

private void Unbound_Row_Load(object sender, EventArgs e)
{
  // 連結されていないFlexGridにデータを入力します
  PopulateGrid(_gridUnbound);
  // 連結されていないFlexGridにツリーを表示します
  ShowTreeNode(_gridUnbound);
}      
private void PopulateGrid(C1FlexGrid grid)
{
  // FlexGridをリセットします
  grid.Rows.Count = 0;
  grid.Cols.Count = 2;
  string fileName = "../../test.xml";
  // xmlドキュメントをロードします
  XmlDocument xdoc = new XmlDocument();
  xdoc.Load(fileName);
  // XMLドキュメントを読み取り、FlexGridのノードとして表示します
  ShowNode(_gridUnbound, xdoc.ChildNodes[1], 0);
  grid.AutoSizeCols();
}
      
// FlexGridでツリーを作成します
private void ShowTreeNode(C1FlexGrid grid)
{
   // ツリーを作成します
   grid.Tree.Column = 0;
   grid.Tree.Style = TreeStyleFlags.SimpleLeaf;
   grid.AutoSizeCols();
}
// FlexGridにxmlノードを追加します
private void ShowNode(C1FlexGrid grid, XmlNode node, int level)
{
  // コメントノードをスキップします
   if (node.NodeType == XmlNodeType.Comment)
  return;
  // 読み取りxmlノードの新しい行を追加します
  int row = grid.Rows.Count;
  grid.Rows.Add();
  // グリッドのセルにxmlノードデータを割り当てます
  grid[row, 0] = node.Name;
  // xmlノードに子が1つしかないかどうかを確認します
   if (node.ChildNodes.Count == 1)
   {
     // グリッドのセルにノード値を設定します
     grid[row, 1] = node.InnerText;
   }
    // 新しい行をノードにします
     grid.Rows[row].IsNode = true;
     grid.Rows[row].Node.Level = level;
    // ノードに子がある場合は、それらも取得します
     if (node.ChildNodes.Count > 1)
     {
       // 子を取得するために再帰します
       foreach (XmlNode child in node.ChildNodes)
       ShowNode(_gridUnbound, child, level + 1);
     }
}               
Private Sub Unbound_Row_Load(ByVal sender As Object, ByVal e As EventArgs)
        ' 連結されていないFlexGridにデータを入力します
        PopulateGrid(_gridUnbound)
        ' 連結されていないFlexGridにツリーを表示します
        ShowTreeNode(_gridUnbound)
    End Sub
    Private Sub PopulateGrid(ByVal grid As C1FlexGrid)
        ' FlexGridをリセットします
        grid.Rows.Count = 0
        grid.Cols.Count = 2
        Dim fileName As String = "../../test.xml"
        ' xmlドキュメントをロードします
        Dim xdoc As XmlDocument = New XmlDocument()
        xdoc.Load(fileName)
        ' XMLドキュメントを読み取り、FlexGridのノードとして表示します
        ShowNode(_gridUnbound, xdoc.ChildNodes(1), 0)
        grid.AutoSizeCols()
    End Sub

    ' FlexGridでツリーを作成します
    Private Sub ShowTreeNode(ByVal grid As C1FlexGrid)
        ' ツリーを作成します
        grid.Tree.Column = 0
        grid.Tree.Style = TreeStyleFlags.SimpleLeaf
        grid.AutoSizeCols()
    End Sub

    ' FlexGridにxmlノードを追加します
    Private Sub ShowNode(ByVal grid As C1FlexGrid, ByVal node As XmlNode, ByVal level As Integer)
    ' コメントノードをスキップします
    If node.NodeType = XmlNodeType.Comment Then Return
    ' 読み取りxmlノードの新しい行を追加します
    Dim row As Integer = grid.Rows.Count
    grid.Rows.Add()
    ' グリッドのセルにxmlノードデータを割り当てます
    grid(row, 0) = node.Name
    ' xmlノードに子が1つしかないかどうかを確認します
    If node.ChildNodes.Count = 1 Then
        '  グリッドのセルにノード値を設定します
        grid(row, 1) = node.InnerText
    End If
    ' 新しい行をノードにします
    grid.Rows(row).IsNode = True
    grid.Rows(row).Node.Level = level
    ' ノードに子がある場合は、それらも取得します
    If node.ChildNodes.Count > 1 Then
        ' 子を取得するために再帰します
        For Each child As XmlNode In node.ChildNodes
            ShowNode(_gridUnbound, child, level + 1)
        Next
    End If
End Sub
関連トピック