DevExpress TreeList獲取選中複選框資料列表
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow
也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!
最近做專案新增光纖線路清查功能模組,思路和演算法已經想好了,些程式碼時候居然在一個控制元件上糾結了好長的時間,雖然後來搞定了,但是好記性不然爛筆頭,還是寫下來,以後要用到的時候直接翻就行,幫助文件看得比較糾結,還是自己寫的好。往往當時會用了,一段時間沒用後再用的時候有要翻幫助文件或網上搜,糾結很久。我們學東西的時候一般不應該花過多精力和時間到控制元件或框架上,但是做專案要的是結果。記得有次去面試敗在機試上,題也簡單,CRUD而已,就是不會用控制元件,浪費了很多時間。
1.資料繫結最基本的兩個屬性:KeyFieldName和ParentFieldName。
SELECT OfficeID,OfficeName,ParentOfficeID FROM tOffice |
這種資料庫設計是比較常見的,一般資料滿足樹形關係就可以這樣設計。繫結資料時,只需指定DataSource為對應 的DataTable,指定KeyFieldName為表主鍵欄位,ParentFieldName為表指向主鍵的外來鍵欄位名。
private void BindData() { this.tlOffice.DataSource = dtOffice; tlOffice.KeyFieldName= "OfficeID"; //tlOffice.DataMember = "OfficeName"; tlOffice.Columns["OfficeName"].Caption = "局名稱"; tlOffice.ParentFieldName = "ParentOfficeID"; }
繫結資料如下:
為讓資料不可編輯,需將OPtionsBehavior→Editable屬性設為False:
① . 選擇某一節點時,該節點的子節點全部選擇 取消某一節點時,該節點的子節點全部取消選擇
哪個節點引起行為的?節點是選中還是取消選中?由此確定方法的兩個引數:TreeListNode和CheckState。遍歷該節點及其子孫,並將其選中狀態設定為該節點的狀態即可。
/// <summary> /// 選擇某一節點時,該節點的子節點全部選擇 取消某一節點時,該節點的子節點全部取消選擇 /// </summary> /// <param name="node"></param> /// <param name="state"></param> private void SetCheckedChildNodes(TreeListNode node, CheckState check) { for (int i = 0; i < node.Nodes.Count; i++) { node.Nodes[i].CheckState = check; SetCheckedChildNodes(node.Nodes[i], check); } }
② . ,某節點的子節點全部選擇時,該節點選擇;某節點的子節點未全部選擇時,該節點不選擇
/// <summary> /// 某節點的子節點全部選擇時,該節點選擇 某節點的子節點未全部選擇時,該節點不選擇 /// </summary> /// <param name="node"></param> /// <param name="check"></param> private void SetCheckedParentNodes(TreeListNode node, CheckState check) { if (node.ParentNode != null) { CheckState parentCheckState = node.ParentNode.CheckState; CheckState nodeCheckState; for (int i = 0; i < node.ParentNode.Nodes.Count; i++) { nodeCheckState = (CheckState)node.ParentNode.Nodes[i].CheckState; if (!check.Equals(nodeCheckState))//只要任意一個與其選中狀態不一樣即父節點狀態不全選 { parentCheckState = CheckState.Unchecked; break; } parentCheckState = check;//否則(該節點的兄弟節點選中狀態都相同),則父節點選中狀態為該節點的選中狀態 } node.ParentNode.CheckState = parentCheckState; SetCheckedParentNodes(node.ParentNode, check);//遍歷上級節點 } }
上兩步寫好了,別忘了上面的兩個方法在TreeList_AfterCheckNode裡面觸發:
private void tlOffice_AfterCheckNode(object sender, DevExpress.XtraTreeList.NodeEventArgs e) { SetCheckedChildNodes(e.Node, e.Node.CheckState); SetCheckedParentNodes(e.Node, e.Node.CheckState); }
執行效果如下圖:
3.獲取選中的複選框資料列表
當用戶選擇一個或多個節點時,要獲取對應的資料,將資料表對應主鍵存到集合中即可。關鍵是怎樣獲取資料,當時就糾結了很久。
private List<int> lstCheckedOfficeID = new List<int>();//選擇局ID集合 /// <summary> /// 獲取選擇狀態的資料主鍵ID集合 /// </summary> /// <param name="parentNode">父級節點</param> private void GetCheckedOfficeID(TreeListNode parentNode) { if (parentNode.Nodes.Count == 0) { return;//遞迴終止 } foreach (TreeListNode node in parentNode.Nodes) { if (node.CheckState == CheckState.Checked) { DataRowView drv = tlOffice.GetDataRecordByNode(node) as DataRowView;//關鍵程式碼,就是不知道是這樣獲取資料而糾結了很久(鬼知道可以轉換為DataRowView啊) if (drv != null) { int OfficeID = (int)drv["OfficeID"]; lstCheckedOfficeID.Add(OfficeID); } } GetCheckedOfficeID(node); } }
下面測試獲取主鍵列表:
private void btnCheck_Click(object sender, EventArgs e) { this.lstCheckedOfficeID.Clear(); if (tlOffice.Nodes.Count > 0) { foreach (TreeListNode root in tlOffice.Nodes) { GetCheckedOfficeID(root); } } string idStr = string.Empty; foreach (int id in lstCheckedOfficeID) { idStr += id + " "; } MessageBox.Show(idStr); }
如下圖:
獲取選中主鍵集合後就能處理相關業務了。暫時寫到這裡了,以後有時間在多多總結