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;
}
为了在 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);
}
}