How can i make a multi-level hierarchical radgridview with load-on-demand in Telerik for Winforms?

57 Views Asked by At

The Telerik website has a tutorial for multi-level gridview at this link: https://docs.telerik.com/devtools/winforms/controls/gridview/hierarchical-grid/binding-to-hierarchical-data-programmatically

And there is a tutorial for Load-On-Demand at this link: https://docs.telerik.com/devtools/winforms/controls/gridview/hierarchical-grid/load-on-demand-hierarchy

But there is none that applies both together. My goal is a 3-level gridview where each level loads when needed.

What I've managed to implement so far is a gridview with two levels using lazy loading. However, there is a need for one more level:

private GridViewTemplate CreateChildTemplate()
{
 GridViewTemplate template = new GridViewTemplate();
 template.AutoSizeColumnsMode = GridViewAutoSizeColumnsMode.Fill;

 var properties = typeof(FirstChildClass).GetProperties();
 foreach (var property in properties)
 {
     template.Columns.Add(new GridViewTextBoxColumn
     {
         Name = property.Name,
         HeaderText = property.Name
     });
 }

 return template;
}

private async void ExampleRadGridView_RowSourceNeeded(object sender, 
Telerik.WinControls.UI.GridViewRowSourceNeededEventArgs e)
{
 firstChildClassList = new BindingList<FirstChildClass>(await 
  _controller.GetFirstChildClass(ParentID);

 var columns = e.Template.Columns;
 GridViewRowInfo _newRowObj = e.Template.Rows.NewRow();

 foreach (var element in orderDetailList)
 {
     foreach (var column in columns)
     {
         string columnName = column.Name;
         var property = typeof(FirstChildClass).GetProperty(columnName);
         if (property != null)
             _newRowObj.Cells[columnName].Value = property.GetValue(element);
     }

     e.SourceCollection.Add(_newRowObj);
 }           
}

private async void FillGridView()
{
 radGridView.Templates.Clear();

 parentList = new BindingList<ParentClass>(await _controller.GetParent(ID);

 radGridView.DataSource = orderList;
 var _childTemplate = CreateChildTemplate();
 radGridView.Templates.Add(_childTemplate);
 _childTemplate.HierarchyDataProvider = new GridViewEventDataProvider(_childTemplate);
 radGridView.RowSourceNeeded -= ExampleRadGridView_RowSourceNeeded;
 radGridView.RowSourceNeeded += ExampleRadGridView_RowSourceNeeded;
}
1

There are 1 best solutions below

3
Dess On

In order to construct a n-level hierarchy in the RadGridView, you should add a GridViewTemplate for each level. Afterwards, it is necessary to initialize the HierarchyDataProvider for the certain template. Thus, using the RadGridView.RowSourceNeeded event, you can load on demand the hierarchical data, considering the ParentRow.HierarchyLevel. Please refer to the following code snippet:

        public RadForm1()
    {
        InitializeComponent();
        this.radGridView1.MasterTemplate.AutoSizeColumnsMode = GridViewAutoSizeColumnsMode.Fill;
        this.radGridView1.Columns.Add("Parent");
        this.radGridView1.Rows.Add("Telerik");
        this.radGridView1.Rows.Add("Test");
        //First Child Template Begins

        GridViewTemplate firstLevelTemplate = new GridViewTemplate();
        firstLevelTemplate.AutoSizeColumnsMode = GridViewAutoSizeColumnsMode.Fill;
        firstLevelTemplate.Columns.Add("Name", "Name", "Name");
        firstLevelTemplate.Columns.Add("Owner", "Owner", "Owner");
        firstLevelTemplate.Columns.Add("Parent", "Parent", "Parent");

        //First Child Template Ends

        this.radGridView1.Templates.Add(firstLevelTemplate);
        this.radGridView1.Templates[0].HierarchyDataProvider = new GridViewEventDataProvider(firstLevelTemplate);
        this.radGridView1.RowSourceNeeded += new GridViewRowSourceNeededEventHandler(radGridView1_RowSourceNeeded);

        //Second Child Template Begins

        GridViewTemplate secondLevelTemplate = new GridViewTemplate();
        secondLevelTemplate.AutoSizeColumnsMode = GridViewAutoSizeColumnsMode.Fill;
        secondLevelTemplate.Columns.Add("Name2", "Name2", "Name2");
        secondLevelTemplate.Columns.Add("Owner2", "Owner2", "Owner2");
        secondLevelTemplate.Columns.Add("Parent2", "Parent2", "Parent2");

        //Second Child Template Ends

        firstLevelTemplate.Templates.Add(secondLevelTemplate);
        this.radGridView1.Templates[0].Templates[0].HierarchyDataProvider = new GridViewEventDataProvider(secondLevelTemplate);
    }
     
    void radGridView1_RowSourceNeeded(object sender, GridViewRowSourceNeededEventArgs e)
    {
        int hierarchicalLevel = e.ParentRow.HierarchyLevel;
        switch (hierarchicalLevel)
        {
            case 0:
                AddDummyData(2,hierarchicalLevel, e.SourceCollection, e.Template);
                break;
            case 1:
                AddDummyData(5, hierarchicalLevel, e.SourceCollection, e.Template);
                break;
            case 2:
                AddDummyData(4, hierarchicalLevel, e.SourceCollection, e.Template);
                break;
            default:
                break;
        }
        

    }

    private void AddDummyData(int rowsCount, int hierarchicalLevel, IList<GridViewRowInfo> sourceCollection, GridViewTemplate template)
    {
        for (int i = 0; i < rowsCount; i++)
        {
            GridViewRowInfo row = template.Rows.NewRow();
            row.Cells[0].Value = "name" + hierarchicalLevel;
            row.Cells[1].Value = "owner" + hierarchicalLevel;
            row.Cells[2].Value = "parent" + hierarchicalLevel;


            sourceCollection.Add(row);
        }
    }

enter image description here