RadGridView for WinForms

RadControls Send comments on this topic.
Binding to Hierarchical Data Programmatically
GridView > Hierarchical Grid > Binding to Hierarchical Data Programmatically

Glossary Item Box

There are many cases when you wouldn't want to include the whole dataset and hierarchy in your application. In such cases you cannot use the automatical mode for hierarchical databinding and you will need to set up the hierarchy in code manually.

Setting the hierarchical grid in bound mode

For setting the hierarchy, you will need the special GridViewRelation class, which defines the related field in parent and child tables. Consider the sample below:

[C#] Setting the hierarchical grid in bound mode Copy Code
radGridView1.DataSource = nwindDataSet.Suppliers;

GridViewTemplate template = new GridViewTemplate();
template.DataSource = nwindDataSet.Products;
radGridView1.MasterGridViewTemplate.ChildGridViewTemplates.Add(
template);

GridViewRelation relation =
new GridViewRelation(radGridView1.MasterGridViewTemplate);
relation.ChildTemplate =
template;
relation.RelationName =
"SuppliersProducts";
relation.ParentColumnNames.Add(
"SupplierID");
relation.ChildColumnNames.Add(
"SupplierID");
radGridView1.Relations.Add(relation);
[VB] Setting the hierarchical grid in bound mode Copy Code
radGridView1.DataSource = nwindDataSet.Suppliers

Dim template As GridViewTemplate = New GridViewTemplate
template.DataSource = nwindDataSet.Products
radGridView1.MasterGridViewTemplate.ChildGridViewTemplates.Add(template)

Dim relation As GridViewRelation = New GridViewRelation(radGridView1.MasterGridViewTemplate)
relation.ChildTemplate = template
relation.RelationName = "SuppliersProducts"
relation.ParentColumnNames.Add("SupplierID")
relation.ChildColumnNames.Add("SupplierID")
radGridView1.Relations.Add(relation)

You can also set the relation in design-time, using the provided collection editor as in the screenshot below:

setting the relation in design-time

Setting the hierarchical grid in unbound mode

Setting the hierarchical grid in unbound mode is quite similar to that for the bound mode with only difference is setting the unbound mode itself. First of all you need to create and the columns you need. After that set up the relation and finally load the data.

 

[C#] Setting the hierarchical grid in unbound mode Copy Code
//setup the master template
GridViewImageColumn column = new GridViewImageColumn("Photo");
column.ImageLayout = ImageLayout.Stretch;
radGridView1.MasterGridViewTemplate.Columns.Add(column);
GridViewTextBoxColumn textColumn =
new GridViewTextBoxColumn("Name");
textColumn.Width = 150;
radGridView1.MasterGridViewTemplate.Columns.Add(textColumn);
radGridView1.MasterGridViewTemplate.Columns.Add(
new GridViewDecimalColumn("Salary"));
GridViewDateTimeColumn dateTimeColumn =
new GridViewDateTimeColumn("Hire Date");
dateTimeColumn.Width = 100;
dateTimeColumn.TextAlignment = ContentAlignment.MiddleCenter;
radGridView1.MasterGridViewTemplate.Columns.Add(dateTimeColumn);
textColumn =
new GridViewTextBoxColumn("Title");
textColumn.Width = 150;
radGridView1.MasterGridViewTemplate.Columns.Add(textColumn);
radGridView1.MasterGridViewTemplate.Columns.Add(
new GridViewCheckBoxColumn("Active"));
radGridView1.MasterGridViewTemplate.Columns.Add(
new GridViewCommandColumn("Action"));
//setup the child template
GridViewTemplate template = new GridViewTemplate();
template.AllowAddNewRow = true;
template.Columns.Add(new GridViewTextBoxColumn("Name"));
template.Columns.Add(new GridViewTextBoxColumn("Product Number"));
template.Columns.Add(new GridViewDecimalColumn("Quantity"));
template.Columns.Add(new GridViewDecimalColumn("Discount"));
template.Columns.Add(new GridViewDecimalColumn("Total"));
radGridView1.MasterGridViewTemplate.ChildGridViewTemplates.Add(
template);
//create the relation
GridViewRelation relation = new GridViewRelation(radGridView1.MasterGridViewTemplate);
relation.ChildTemplate =
template;
relation.RelationName =
"EmployeesOrders";
relation.ParentColumnNames.Add(
"Name");
relation.ChildColumnNames.Add(
"Name");
radGridView1.Relations.Add(relation);
//load data
LoadUnboundData();

private void LoadUnboundData()
{
for (int i = 0; i < nwindDataSet.Employees.Count; i++)
{
 Random random =
new Random((int)DateTime.Now.Ticks);
 Telerik.Examples.WinControls.DataSources.NorthwindDataSet.EmployeesRow row = nwindDataSet.Employees[i];
 
string name = row.FirstName + " " + row.LastName;
 radGridView1.MasterGridViewTemplate.Rows.Add(GetImageFromBytes(row.Photo), name, random.Next(45000),
  row.HireDate, row.Title, (random.Next(100) > 50),
"View");
 GridViewTemplate
template = radGridView1.MasterGridViewTemplate.ChildGridViewTemplates[0];
 
int rowCount = random.Next(20);
 
for (int j = 0; j < rowCount; j++)
 {
  
template.Rows.Add(name, random.Next(1000), random.Next(50), random.Next(100), random.Next(10000));
 }
}
}
[VB] Setting the hierarchical grid in unbound mode Copy Code
'setup the master template
Dim column As GridViewImageColumn = New GridViewImageColumn("Photo")
column.ImageLayout = ImageLayout.Stretch
radGridView1.MasterGridViewTemplate.Columns.Add(column)
Dim textColumn As GridViewTextBoxColumn = New GridViewTextBoxColumn("Name")
textColumn.Width = 150
radGridView1.MasterGridViewTemplate.Columns.Add(textColumn)
radGridView1.MasterGridViewTemplate.Columns.Add(New GridViewDecimalColumn("Salary"))
Dim dateTimeColumn As GridViewDateTimeColumn = New GridViewDateTimeColumn("Hire Date")
dateTimeColumn.Width = 100
dateTimeColumn.TextAlignment = ContentAlignment.MiddleCenter
radGridView1.MasterGridViewTemplate.Columns.Add(dateTimeColumn)
textColumn = New GridViewTextBoxColumn("Title")
textColumn.Width = 150
radGridView1.MasterGridViewTemplate.Columns.Add(textColumn)
radGridView1.MasterGridViewTemplate.Columns.Add(New GridViewCheckBoxColumn("Active"))
radGridView1.MasterGridViewTemplate.Columns.Add(New GridViewCommandColumn("Action"))
Dim template As GridViewTemplate = New GridViewTemplate
template.AllowAddNewRow = true
template.Columns.Add(New GridViewTextBoxColumn("Name"))
template.Columns.Add(New GridViewTextBoxColumn("Product Number"))
template.Columns.Add(New GridViewDecimalColumn("Quantity"))
template.Columns.Add(New GridViewDecimalColumn("Discount"))
template.Columns.Add(New GridViewDecimalColumn("Total"))
radGridView1.MasterGridViewTemplate.ChildGridViewTemplates.Add(template)
Dim relation As GridViewRelation = New GridViewRelation(radGridView1.MasterGridViewTemplate)
relation.ChildTemplate = template
relation.RelationName = "EmployeesOrders"
relation.ParentColumnNames.Add("Name")
relation.ChildColumnNames.Add("Name")
radGridView1.Relations.Add(relation)
'load data
LoadUnboundData

    Private Sub LoadUnboundData()
        Dim i As Integer = 0
        Do While (i < nwindDataSet.Employees.Count)
            Dim random As Random = New Random(CType(DateTime.Now.Ticks,Integer))
            Dim row As Telerik.Examples.WinControls.DataSources.NorthwindDataSet.EmployeesRow = nwindDataSet.Employees(i)
            Dim name As String = (row.FirstName + (" " + row.LastName))
            radGridView1.MasterGridViewTemplate.Rows.Add(GetImageFromBytes(row.Photo), name, random.Next(45000), row.HireDate, row.Title, (random.Next(100) > 50), "View")
            Dim template As GridViewTemplate = radGridView1.MasterGridViewTemplate.ChildGridViewTemplates(0)
            Dim rowCount As Integer = random.Next(20)
            Dim j As Integer = 0
            Do While (j < rowCount)
                template.Rows.Add(name, random.Next(1000), random.Next(50), random.Next(100), random.Next(10000))
                j = (j + 1)
            Loop
            i = (i + 1)
        Loop
    End Sub