轉(zhuǎn)帖|使用教程|編輯:龔雪|2021-12-03 09:49:38.530|閱讀 288 次
概述:本文介紹如何使用DevExpress GridControl實現(xiàn)多層級或無窮級的嵌套列表展示,歡迎下載最新版體驗!
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
相關(guān)鏈接:
使用DevExpress GridControl實現(xiàn)二級、三級的層級列表展示,主要的邏輯就是構(gòu)建GridLevelNode并添加到LevelTree集合里面,手動創(chuàng)建多個承載顯示的gridview,然后添加到視圖集合里面去吧,不過這個是已知層級的情況下,如果是無窮級,這種手工創(chuàng)建視圖的方式,肯定不太適合,而且很繁瑣,本文來改進一下,介紹如何實現(xiàn)多層級或無窮級的嵌套列表展示。
根據(jù)數(shù)據(jù)展示的定義,我們構(gòu)建一些測試的數(shù)據(jù),如下所示。
//創(chuàng)建測試數(shù)據(jù)
var result = new Detail2Result()
{
Name = "測試",
Description = "描述內(nèi)容",
Detail2List = new List<DetailInfo>()
{
new DetailInfo()
{
Name = "111測試",
Description = "111描述內(nèi)容"
},
new DetailInfo()
{
Name = "222測試",
Description = "222描述內(nèi)容"
},
new DetailInfo()
{
Name = "333測試",
Description = "333描述內(nèi)容"
}
}
};
//構(gòu)造一個記錄的集合
var list = new List<Detail2Result>() { result };
接著通過代碼創(chuàng)建我們需要的視圖信息,如創(chuàng)建主表的GridView顯示如下所示。
GridView grv2 = null;
/// <summary>
/// 創(chuàng)建第二個視圖
/// </summary>
private void CreateLevelView()
{
var grv = this.gridView1;
var gridControl = this.gridControl1;
//創(chuàng)建一個從表的GridView對象
grv2 = new GridView();
grv2.ViewCaption = "記錄明細";
grv2.Name = "grv2";
grv2.GridControl = gridControl;
//構(gòu)建GridLevelNode并添加到LevelTree集合里面
var node = new GridLevelNode();
node.LevelTemplate = grv2;
node.RelationName = "Detail2List";//這里對應集合的屬性名稱
gridControl.LevelTree.Nodes.AddRange(new GridLevelNode[]
{
node
});
//添加對應的視圖集合顯示
gridControl.ViewCollection.Clear();
gridControl.ViewCollection.AddRange(new BaseView[] { grv, grv2 });
//創(chuàng)建從表顯示的列
grv2.Columns.Clear();
grv2.CreateColumn("ID", "ID");
grv2.CreateColumn("Name", "名稱");
grv2.CreateColumn("Description", "描述內(nèi)容");
//設置非只讀、可編輯
grv2.OptionsBehavior.ReadOnly = false;
grv2.OptionsBehavior.Editable = true;
}
剩下的就是數(shù)據(jù)的綁定處理了,這里構(gòu)建列表,綁定數(shù)據(jù)源展示即可。
//構(gòu)造一個記錄的集合
var list = new List<Detail2Result>() { result };
//綁定數(shù)據(jù)源
this.gridControl1.DataSource = list;
可以看到例子的效果界面如下所示。
 
 
二級和三級處理的方式類似,就不再贅述了。
 
 
如果是不確定的多層級列表展示,那么我們應該如何處理呢,手工逐一創(chuàng)建視圖的方式,肯定不合適,畢竟有時候數(shù)據(jù)層次是不確定的,如下數(shù)據(jù)結(jié)構(gòu)所示,它是一個嵌套的數(shù)據(jù)結(jié)構(gòu)。
/// <summary>
/// 本類用于演示多層級的數(shù)據(jù)列表的展示
/// </summary>
public class DetailNodeInfo
{
public DetailNodeInfo()
{
this.ID = Guid.NewGuid().ToString();
}
/// <summary>
/// ID標識
/// </summary>
public string ID { get; set; }
/// <summary>
/// 名稱
/// </summary>
public string Name { get; set; }
/// <summary>
/// 描述信息
/// </summary>
public string Description { get; set; }
public List<DetailNodeInfo> Children { get; set; } = new List<DetailNodeInfo>();//初始化
}
這里面我們的嵌套列表使用了Children屬性。
這樣我們創(chuàng)建視圖的時候,只需要創(chuàng)建主視圖gridview即可,如下所示:
/// <summary>
/// 創(chuàng)建第一個視圖
/// </summary>
private void CreateGridView()
{
var grv = this.gridView1;
var gridControl = this.gridControl1;
//創(chuàng)建從表顯示的列
grv.Columns.Clear();
grv.CreateColumn("ID", "ID");//.Visible = false;
grv.CreateColumn("Name", "名稱");
grv.CreateColumn("Description", "描述內(nèi)容");
//列表是否只讀
grv.OptionsBehavior.ReadOnly = false;
//列表是否可以編輯
grv.OptionsBehavior.Editable = true;
//gridview列表注冊的時候,觸發(fā)處理
gridControl.ViewRegistered += GridControl_ViewRegistered;
}
其中紅色的ViewRegistered是用來觸發(fā)從表視圖的時候,我們處理列頭的中文信息的。
private void GridControl_ViewRegistered(object sender, ViewOperationEventArgs e)
{
var detailView = e.View as GridView;
if (detailView != null)
{
SetGridViewCaption(detailView);
}
}
private void SetGridViewCaption(GridView view)
{
foreach (GridColumn column in view.Columns)
{
SetColumnCaption(column, "id", "編號");
SetColumnCaption(column, "name", "名稱");
SetColumnCaption(column, "name", "描述內(nèi)容");
}
}
private void SetColumnCaption(GridColumn column, string fieldName, string caption)
{
if(column != null && column.FieldName.Equals(fieldName, StringComparison.OrdinalIgnoreCase))
{
column.Caption = caption;
}
}
為了測試無窮級嵌套列表的展示,我們創(chuàng)建了一個多級的嵌套列表數(shù)據(jù),如下所示。
/// <summary>
/// 綁定數(shù)據(jù)源
/// </summary>
private void BindData()
{
//創(chuàng)建測試數(shù)據(jù)
var result = new DetailNodeInfo()
{
Name = "測試1",
Description = "描述內(nèi)容",
//二級列表
Children = new List<DetailNodeInfo>()
{
new DetailNodeInfo()
{
Name = "測試2",
Description = "描述內(nèi)容",
//三級列表
Children = new List<DetailNodeInfo>()
{
new DetailNodeInfo()
{
Name = "3測試",
Description = "描述內(nèi)容",
//四級列表
Children = new List<DetailNodeInfo>()
{
new DetailNodeInfo()
{
Name = "4測試",
Description = "描述內(nèi)容",
Children = new List<DetailNodeInfo>()
{
new DetailNodeInfo()
{
Name = "5測試",
Description = "描述內(nèi)容",
Children = null
}
}
}
}
}
}
}
}
};
綁定操作代碼和之前處理沒有什么異樣。
 
 
//構(gòu)造一個記錄的集合
var list = new List<DetailNodeInfo>() { result };
//綁定數(shù)據(jù)源
this.gridControl1.DataSource = list;
注意,以上列表只是展示,并沒有保存處理。
如果需要綁定可以直接錄入并保存的操作,列表必須為BindingList<T>類型,這個才能記錄狀態(tài)的,如下數(shù)據(jù)結(jié)構(gòu)定義所示。
 
 
DevExpress Universal 10月正式發(fā)布今年第二個重大版本——v21.2,此版本正式官宣支持Visual Studio 2022 & .NET6,同時與微軟最新發(fā)布的Windows 11完美兼容,全面解決用戶各種使用場景問題。 與時俱進,從未止步!DevExpress 2021最新版本v21.2已正式發(fā)布,慧都獨家搶先解析最新功能、新控件預覽與應用,帶您解鎖2021最強UI控件,助您構(gòu)建出色的應用程序!
本文轉(zhuǎn)載自:
DevExpress技術(shù)交流群5:742234706 歡迎一起進群討論
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請務必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請郵件反饋至chenjj@ke049m.cn
文章轉(zhuǎn)載自: