DevExpress TreeList使用心得


來自:http://www.cnblogs.com/sndnnlfhvk/archive/2011/05/15/2046920.html

最近做項目新增光纖線路清查功能模塊,思路和算法已經想好了,些代碼時候居然在一個控件上糾結了好長的時間,雖然后來搞定了,但是好記性不然爛筆頭,還是寫下來,以后要用到的時候直接翻就行,幫助文檔看得比較糾結,還是自己寫的好。往往當時會用了,一段時間沒用后再用的時候有要翻幫助文檔或網上搜,糾結很久。我們學東西的時候一般不應該花過多精力和時間到控件或框架上,但是做項目要的是結果。記得有次去面試敗在機試上,題也簡單,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); }
復制代碼

 

如下圖:

獲取選中主鍵集合后就能處理相關業務了。暫時寫到這里了,以后有時間在多多總結。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM