轉(zhuǎn)帖|使用教程|編輯:龔雪|2021-06-04 11:02:32.463|閱讀 439 次
概述:本文主要介紹如何使用DevExpress GridControl實現(xiàn)多層級或無窮級的嵌套列表展示。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
相關(guān)鏈接:
DevExpress Universal Subscription擁有.NET開發(fā)需要的所有平臺控件,包含600多個UI控件、報表平臺、DevExpress Dashboard eXpressApp 框架、適用于 Visual Studio的CodeRush等一系列輔助工具。
屢獲大獎的軟件開發(fā)平臺DevExpress 近期正式發(fā)布了v21.1,最新版擁有眾多新產(chǎn)品和數(shù)十個具有高影響力的功能,可為桌面、Web和移動應用提供直觀的解決方案,全面解決各種使用場景問題。
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)定義所示。
本文轉(zhuǎn)載自:
DevExpress技術(shù)交流群3:700924826 歡迎一起進群討論
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請務必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉(zhuǎn)載自: