You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Telerik WinForms中实现按需加载的三级层级RadGridView

实现Telerik WinForms三级按需加载GridView

Telerik官网提供了多层GridView和按需加载的独立教程,但没有覆盖三级结构+全层级按需加载的场景。以下是基于现有二级实现,扩展到三级按需加载的完整方案:

现有二级实现代码

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. 创建第三级模板

新增创建第三级模板的方法,对应你的SecondChildClass:

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

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

    return template;
}

2. 为第二级模板添加按需加载事件

新增处理第二级行展开时加载第三级数据的事件方法:

private async void ChildGridView_RowSourceNeeded(object sender, GridViewRowSourceNeededEventArgs e)
{
    // 获取当前展开的第二级行的主键ID,作为第三级数据的父级查询条件
    var parentRow = e.ParentRow;
    int firstChildId = (int)parentRow.Cells["Id"].Value; // 需确保FirstChildClass包含主键字段Id

    // 异步加载第三级数据
    var grandChildList = new BindingList<SecondChildClass>(await _controller.GetSecondChildClass(firstChildId));

    var columns = e.Template.Columns;
    foreach (var element in grandChildList)
    {
        GridViewRowInfo newRow = e.Template.Rows.NewRow();
        foreach (var column in columns)
        {
            string columnName = column.Name;
            var property = typeof(SecondChildClass).GetProperty(columnName);
            if (property != null)
                newRow.Cells[columnName].Value = property.GetValue(element);
        }
        e.SourceCollection.Add(newRow);
    }
}

3. 修改二级模板创建逻辑,关联第三级模板

修改CreateChildTemplate方法,在其中嵌入第三级模板并绑定加载事件:

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

    // 初始化并绑定第三级模板
    var grandChildTemplate = CreateGrandChildTemplate();
    template.Templates.Add(grandChildTemplate);
    grandChildTemplate.HierarchyDataProvider = new GridViewEventDataProvider(grandChildTemplate);
    grandChildTemplate.RowSourceNeeded -= ChildGridView_RowSourceNeeded;
    grandChildTemplate.RowSourceNeeded += ChildGridView_RowSourceNeeded;

    return template;
}

关键注意事项

  • 确保FirstChildClass包含用于关联第三级数据的主键字段(如示例中的Id)
  • 调整_controller.GetSecondChildClass的参数逻辑,匹配你的数据查询规则
  • 异步加载操作中若涉及UI更新,需通过Invoke确保线程安全

内容的提问来源于stack exchange,提问作者Ádám Benk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 12:33:29