最近公司做項目用到了easyui復選框樹來實現加載不同類型產品。因為我剛剛畢業,現在也算是實習吧,所以一臉懵逼啊。在公司里的一個哥的幫助下 ,我寫出來這個EasyUi復選框樹了,雖然東西不難,但也是自己弄出來的,有成就感,進步總要一點一點的,經驗需要積累。
先上一下圖片吧 ,輕噴啊 我是應屆生。。。。
查看了一下API,
給一組Json數據,其中要包括必要的樹控件的屬性,這下就有了思路。可以順着思路走,既然它需要這些屬性,那么我們就創建一個Model,其中包括這些屬性,名稱要相同哦,
1 public class TreeModel 2 { 3 public string id { get; set; } 4 5 public string text { get; set; } 6 7 public string state { get; set; } 8 9 public string iconCls { get; set; } 10 11 //子節點 12 public List<TreeModel> children { get; set; } 13 }
有了Model之后,就可以為這個Model寫方法賦值,把從數據庫里查到的數據賦值給樹節點,這就可以進行數據的展示了,比如此處,我要從數據字典里獲取到產品的類別,然后與數據庫表進行關聯查詢出每個類別下的產品,綁定到model上並賦值給樹。代碼如下
public List<TreeModel> GetProduct() { using (DBModelContainer db = new DBModelContainer()) { List<TreeModel> ls = new List<TreeModel>(); //TreeModel tm = new TreeModel(); //tm.id = "01"; //tm.text = "蔬菜"; //tm.state = "closed"; //tm.children = GetChild("01"); //ls.Add(tm); ComDictionaryRepository dic=new ComDictionaryRepository(db); var query = dic.GetList(); var queryData = from a in query.ToList() select new TreeModel { id = a.DicValue, text = a.DicText, //iconCls="icon-save" state = getState(a.DicValue) == true ? "closed" : "open", children = GetChild(a.DicValue) }; var list = queryData.ToList(); return list; } } private bool getState(string ProductId) { bool b = false; if (ProductId!=""&& ProductId!=null) { b = false; } else { b = true; } return b; } public List<TreeModel> GetChild(string ParentId) { List<TreeModel> list; if (string.IsNullOrEmpty(ParentId)) { list = new List<TreeModel>(); } else { using (DBModelContainer db = new DBModelContainer()) { var queryData = from a in db.Product where a.ParentId == ParentId select new TreeModel { id = a.ProductId, text = a.ProductName, state = "open"//, //children = GetProduct() }; list = queryData.ToList(); } } return list; }
代碼寫的有點shit,,,注釋掉的是開始做的時候寫死的,為了看效果,不舍得刪除啊,
接下來就是前台的Js用來接收數據了
1 $('#myTree').tree({ 2 url: '/ProductGroup/GetProduct', 3 onLoadSuccess: function (node, data) { 4 var tree = $(this); 5 if (data) { 6 $(data).each(function (index, d) { 7 if (this.state == 'closed') { 8 tree.tree('expandAll'); 9 } 10 }); 11 } 12 } 13 });
這是Js初始化加載
獲取選中的樹節點(可以獲取Id值和文本值),這里我需要的是ID值,下面是Js代碼
1 //獲取選中的樹節點 2 function getChecked() { 3 var nodes = $('#myTree').tree('getChecked'); 4 var s = ''; 5 for (var i = 0; i < nodes.length; i++) { 6 if (s != '') s += ','; 7 s += nodes[i].id; 8 } 9 //alert(s); 10 return s; 11 }
清除選中復選框的代碼
1 function unCheck() { 2 var nodes = $('#myTree').tree('getChecked')//獲取選中的樹復選框 3 for (var i = 0; i < nodes.length; i++) { 4 $('#myTree').tree('uncheck',nodes[i].target); 5 } 6 }
在修改數據的時候需要首先加載已存在的數據,對於復選框樹來說,這就涉及到了把對應產品自動選中,實現這個功能最簡單的辦法就是先加載出全部的產品,然后再拿到一組數據與復選框樹全部的ID進行對比,如果相同,設置復選框為選中狀態,否則不操作。
后台
1 /// <summary> 2 /// 用來與所有的Tree復選框作對比,並把結果集的對應復選框進行回填 3 /// </summary> 4 /// <param name="groupId"></param> 5 /// <returns></returns> 6 public ActionResult GetChecked(string groupId) 7 { 8 groupId = Request.Params["groupId"]; 9 List<ProductGroupRelModel> list; 10 list = m_BLL.GetChecked(groupId); 11 return Json(list, JsonRequestBehavior.AllowGet); 12 }
下面貼代碼,注釋是我的思考過程,還是舍不得刪除啊~~~~
1 function EditInfo() { 2 3 if ($('#List').datagrid('getSelections')[0] != null && $('#List').datagrid('getSelections')[0].Id != "") { 4 $('#txtName').textbox('setValue', $('#List').datagrid('getSelections')[0].GroupName); 5 var groupId = $('#List').datagrid('getSelections')[0].Id; 6 7 $.ajax({ 8 type: "post", 9 url: "/ProductGroup/GetChecked", 10 data: { "groupId": groupId }, 11 dataType: "json", 12 success: function (data) { 13 14 // var nodes = $('#myTree').tree('getChecked', 'unchecked');//接收未選中的(因為不知道所有的怎么遍歷所以這里用未選中來代替) 15 var nodes = $('#myTree').tree('getChildren', 'unchecked'); 16 //for (var i = 0; i < data.length; i++) { 17 // //用獲取到的數據的id與所有的id相對比,如果相同了,則設置當前的這個復選框的狀態為被選中 18 // //。。。怎么設置呢? 19 // if (nodes[i].id == data.id) { 20 // //nodes[i].checked = "true";//設置為選中狀態 21 // $('#myTree').tree('check', nodes[i].target); 22 // } 23 //} 24 25 for (var i = 0; i < data.length; i++) { 26 for (var j = 0; j < nodes.length; j++) { 27 if (data[i].Id == nodes[j].id) { 28 $('#myTree').tree('check', nodes[j].target);/////////-----------------tmd!!!!!!這是nodes[J]好不好!!!!!寫什么I ????? 29 } 30 //else { 31 // $('#myTree').tree('uncheck', nodes[i].target); 32 //} >>>>>>>>>>>>>>>>>>>>>不知道是什么鬼,加上這個就不能選中了 33 } 34 } 35 } 36 37 }) 38 $('#btnSubmit').show(); 39 40 $('#infoWindow').panel('setTitle', '修改產品組信息'); 41 $('#infoWindow').window('open'); 42 var submitType = 2; 43 } 44 else { 45 $.messager.alert('提示', '請選擇一條數據進行修改!', 'warning'); 46 } 47 }
好了,基本上就是這么個過程,有很多不足的地方,希望朋友們有什么好的想法可以告知小弟一下,
嗯!!!!學習!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!