| Using the C1FlexGrid Control > Outlining and Summarizing Data > Creating Custom Trees |
To create outline trees without using the Subtotal method, you need to follow these steps:
For example, the code below creates a directory tree:
To write code in Visual Basic
| Visual Basic |
Copy Code
|
|---|---|
' add these Imports statements at the top of the for.
Imports System.IO
Imports C1.Win.C1FlexGrid
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
' Initialize grid layout.
_flex.Cols.Fixed = 0
_flex.Cols.Count = 1
_flex.Rows.Count = 1
_flex.ExtendLastCol = True
_flex.Styles.Normal.TextAlign = TextAlignEnum.LeftCenter
_flex.Styles.Normal.Border.Style = BorderStyleEnum.None
' Show outline tree.
_flex.Tree.Column = 0
_flex.Tree.Style = TreeStyleFlags.SimpleLeaf
_flex.Tree.LineColor = Color.DarkBlue
' Populate the grid.
AddDirectory("c:\", 0)
End Sub
|
|
To write code in C#
| C# |
Copy Code
|
|---|---|
// add these using statements at the top of the for.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;
using C1.Win.C1FlexGrid;
private void Form1_Load(object sender, EventArgs e)
{
// Initialize grid layout.
_flex.Cols.Fixed = 0;
_flex.Cols.Count = 1;
_flex.Rows.Count = 1;
_flex.ExtendLastCol = true;
_flex.Styles.Normal.TextAlign = TextAlignEnum.LeftCenter;
_flex.Styles.Normal.Border.Style = BorderStyleEnum.None;
// Initialize outline tree.
_flex.Tree.Column = 0;
_flex.Tree.Style = TreeStyleFlags.SimpleLeaf;
_flex.Tree.LineColor = Color.DarkBlue;
// Populate the grid.
AddDirectory(@"c:\\", 0);
}
|
|
The code above initializes the grid layout and calls the AddDirectory routine that does the job of populating the grid and setting up the tree structure:
To write code in Visual Basic
| Visual Basic |
Copy Code
|
|---|---|
Private Sub AddDirectory(ByVal dir As String, ByVal level As Integer)
' Add this directory.
Dim thisDir As String
thisDir = Path.GetFileName(dir)
If thisDir.Length = 0 Then thisDir = dir
_flex.AddItem(thisDir)
' Make this new row a node.
Dim row As Row
row = _flex.Rows(_flex.Rows.Count - 1)
row.IsNode = True
' Set the node level.
Dim nd As Node
nd = row.Node
nd.Level = level
' Add files in this directory.
Dim file As String, cnt As Integer, r As Row
cnt = 0
For Each file In Directory.GetFiles(dir)
_flex.AddItem(Path.GetFileName(file).ToLower())
r = _flex.Rows(_flex.Rows.Count – 1)
r.IsNode = True
r.Node.Level = level + 1
cnt = cnt + 1
If cnt > 10 Then Exit For
Next
' Add subdirectories (up to level 4).
If level <= 4 Then
Dim subdir As String
cnt = 0
For Each subdir In Directory.GetDirectories(dir)
AddDirectory(subdir, level + 1)
cnt = cnt + 1
If cnt > 10 Then Exit For
Next
End If
End Sub
|
|
To write code in C#
| C# |
Copy Code
|
|---|---|
private void AddDirectory(string dir, int level)
{
// add this director.
string thisDir = Path.GetFileName(dir);
if (thisDir.Length == 0) { thisDir = dir; }
_flex.AddItem(thisDir);
//make this new row a node
Row row = _flex.Rows[_flex.Rows.Count - 1];
row.IsNode = true;
//set node level
Node nd = row.Node;
nd.Level = level;
// add files in this director.
int cnt = 0;
Row r;
foreach (string file in Directory.GetFiles(dir))
{
_flex.AddItem(Path.GetFileName(file).ToLower());
//mark the row without child row as node
r = _flex.Rows[_flex.Rows.Count - 1];
r.IsNode = true;
r.Node.Level = level + 1;
cnt = cnt + 1;
if (cnt > 10) break;
}
// add subdirectories (up to level 4.
if (level <= 4)
{
cnt = 0;
foreach (string subdir in Directory.GetDirectories(dir))
{
AddDirectory(subdir, level + 1);
cnt = cnt + 1;
if (cnt > 10) break;
}
}
}
|
|
AddDirectory is a recursive routine that traverses the current directory and all its subdirectories. In this example, the tree size is limited to four directory levels in order to save time. In a real application, the routine should be changed to populate tree branches only when they are expanded (see the FlexGrid for WinForms Tutorials).
This code creates a grid that looks like this: