在我早期的隨筆《在GridControl表格控制元件中實作多層級主從表資料的展示》中介紹過GridControl實作二級、三級的層級串列展示,主要的邏輯就是構建GridLevelNode并添加到LevelTree集合里面,手動創建多個承載顯示的gridview,然后添加到視圖集合里面去吧,不過這個是已知層級的情況下,如果是無窮級,這種手工創建視圖的方式,肯定不太適合,而且很繁瑣,我們本篇隨筆來改進一下,介紹如何實作多層級或無窮級的嵌套串列展示,
1、回顧二級、三級層級的處理
根據資料展示的定義,我們構建一些測驗的資料,如下所示,
//創建測驗資料 var result = new Detail2Result() { Name = "測驗", Description = "描述內容", Detail2List = new List<DetailInfo>() { new DetailInfo() { Name = "111測驗", Description = "111描述內容" }, new DetailInfo() { Name = "222測驗", Description = "222描述內容" }, new DetailInfo() { Name = "333測驗", Description = "333描述內容" } } }; //構造一個記錄的集合 var list = new List<Detail2Result>() { result };
接著通過代碼創建我們需要的視圖資訊,如創建主表的GridView顯示如下所示,
GridView grv2 = null; /// <summary> /// 創建第二個視圖 /// </summary> private void CreateLevelView() { var grv = this.gridView1; var gridControl = this.gridControl1; //創建一個從表的GridView物件 grv2 = new GridView(); grv2.ViewCaption = "記錄明細"; grv2.Name = "grv2"; grv2.GridControl = gridControl; //構建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 }); //創建從表顯示的列 grv2.Columns.Clear(); grv2.CreateColumn("ID", "ID"); grv2.CreateColumn("Name", "名稱"); grv2.CreateColumn("Description", "描述內容"); //設定非只讀、可編輯 grv2.OptionsBehavior.ReadOnly = false; grv2.OptionsBehavior.Editable = true; }
剩下的就是資料的系結處理了,這里構建串列,系結資料源展示即可
//構造一個記錄的集合 var list = new List<Detail2Result>() { result }; //系結資料源 this.gridControl1.DataSource = list;
可以看到例子的效果界面如下所示,

二級和三級處理的方式類似,就不再贅述了,

2、多層級或無窮級的嵌套串列展示
如果是不確定的多層級串列展示,那么我們應該如何處理呢,手工逐一創建視圖的方式,肯定不合適,畢竟有時候資料層次是不確定的,如下資料結構所示,它是一個嵌套的資料結構,
/// <summary> /// 本類用于演示多層級的資料串列的展示 /// </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屬性,
這樣我們創建視圖的時候,只需要創建主視圖gridview即可,如下所示
/// <summary> /// 創建第一個視圖 /// </summary> private void CreateGridView() { var grv = this.gridView1; var gridControl = this.gridControl1; //創建從表顯示的列 grv.Columns.Clear(); grv.CreateColumn("ID", "ID");//.Visible = false; grv.CreateColumn("Name", "名稱"); grv.CreateColumn("Description", "描述內容"); //串列是否只讀 grv.OptionsBehavior.ReadOnly = false; //串列是否可以編輯 grv.OptionsBehavior.Editable = true; //gridview串列注冊的時候,觸發處理 gridControl.ViewRegistered += GridControl_ViewRegistered; }
其中紅色的ViewRegistered是用來觸發從表視圖的時候,我們處理列頭的中文資訊的
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", "描述內容"); } } private void SetColumnCaption(GridColumn column, string fieldName, string caption) { if(column != null && column.FieldName.Equals(fieldName, StringComparison.OrdinalIgnoreCase)) { column.Caption = caption; } }
為了測驗無窮級嵌套串列的展示,我們創建了一個多級的嵌套串列資料,如下所示,
/// <summary> /// 系結資料源 /// </summary> private void BindData() { //創建測驗資料 var result = new DetailNodeInfo() { Name = "測驗1", Description = "描述內容", //二級串列 Children = new List<DetailNodeInfo>() { new DetailNodeInfo() { Name = "測驗2", Description = "描述內容", //三級串列 Children = new List<DetailNodeInfo>() { new DetailNodeInfo() { Name = "3測驗", Description = "描述內容", //四級串列 Children = new List<DetailNodeInfo>() { new DetailNodeInfo() { Name = "4測驗", Description = "描述內容", Children = new List<DetailNodeInfo>() { new DetailNodeInfo() { Name = "5測驗", Description = "描述內容", Children = null } } } } } } } } };
系結操作代碼和之前處理沒有什么異樣,
//構造一個記錄的集合 var list = new List<DetailNodeInfo>() { result }; //系結資料源 this.gridControl1.DataSource = list;

注意,以上串列只是展示,并沒有保存處理,
如果需要系結可以直接錄入并保存的操作,串列必須為BindingList<T>型別,這個才能記錄狀態的,如下資料結構定義所示,

詳細可以參考我隨筆《基于主從表資料錄入的處理》 中的介紹,
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/285408.html
標籤:WinForm
上一篇:行程守護
下一篇:【翻譯】WPF中的資料系結運算式
