我如何在Telerik for Winforms中制作一个具有按需加载的多级分层radgridview?

问题描述 投票:0回答:1

Telerik 网站在此链接上提供了多级网格视图的教程: https://docs.telerik.com/devtools/winforms/controls/gridview/hierarchical-grid/binding-to-hierarchical-data-programmatically

此链接有一个按需加载的教程: https://docs.telerik.com/devtools/winforms/controls/gridview/hierarchical-grid/load-on-demand-hierarchy

但是没有一个可以同时应用两者。我的目标是一个 3 级网格视图,每个级别在需要时加载。

到目前为止,我成功实现的是使用延迟加载的两级网格视图。然而,还需要一个级别:

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;
}
c# winforms datagridview telerik
1个回答
0
投票

为了在 RadGridView 中构建 n 级层次结构,您应该为每个级别添加一个 GridViewTemplate。之后,需要为特定模板初始化HierarchyDataProvider。因此,使用 RadGridView.RowSourceNeeded 事件,您可以根据需要加载分层数据,同时考虑 ParentRow.HierarchyLevel。请参考以下代码片段:

        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);
        }
    }

© www.soinside.com 2019 - 2024. All rights reserved.