如何在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
相关产品推荐
相关产品推荐

