做項目時,需要用到帶複選框的tree。經比較後優選了ztree,功能強大,文檔清晰。
http://www.treejs.cn/v3/api.php
直接上代碼吧。
1、下載下傳ztree後。将裡面需要用到的css,js檔案,複制到項目中,引用到需要的頁面
<link rel="stylesheet" href="/Content/ztree/demo.css" target="_blank" rel="external nofollow" type="text/css">
<link rel="stylesheet" href="/Content/ztree/zTreeStyle/zTreeStyle.css" target="_blank" rel="external nofollow" type="text/css">
<script type="text/javascript" src="/Scripts/ztree/jquery.ztree.core.min.js"></script>
<script type="text/javascript" src="/Scripts/ztree/jquery.ztree.excheck.js"></script>
<style>
table th {
text-align: center !important;
}
ul.ztree {
height: 200px;
}
.ztree li {
//原有項間距太小
margin: 5px;
}
.ztree * {
//原有字型太小
font-size: 15px !important;
}
</style>
2、form中或者其他地方 添加個ul 的tree
<div class="col-sm-6">
@Html.TextBoxFor(m => m.AreasString, new { id = "userArea", @class = "form-control popupwindowinput hidden" })
@Html.ValidationMessageFor(m => m.AreasString)
<ul id="areaTree" class="ztree"></ul>
</div>
3、js中設定ztree的配置參數
var editUserId = "";
var rawGetAreaUrl= "@Url.Action("GetAreasTree", "CommonAjax",new {userId="_userId_",roleName="_roleName_"})";
//我用的asp.net 中的mvc, 注意傳參時的&被轉碼了
var decodeGetAreaUrl = rawGetAreaUrl.replace(/amp;/g, "");
var selectIds = new Array();
var treeSettings = {
async: {
enable: true,
type: "post",
contentType: "text/html;charset=UTF-8",
dataType: 'json',
url: decodeGetAreaUrl
},
view : {
showIcon : false,
selectedMulti : true, //可以多選
showLine : false,
expandSpeed : 'fast',
dblClickExpand : false
},
check : {
enable : true,
chkStyle : "checkbox", //複選框
//父子不關聯,各選各的。
chkboxType : {
"Y": "",
"N" : ""
}
},
data : {
simpleData : {
enable: true,
idKey: "id"
},
//key是ztree字段與背景接口字段的映射。一開始想用kendo ui的tree,是以背景一些字段名稱和ztree不太對應
key: {
checked:"IsChecked",
children: "Items",
name: "Name",
isParent:"IsParent" //葉子節點前面沒有加号
}
},
callback : {
onCheck : checkAreaTree
}
};
4、初始化樹
$.fn.zTree.init($("#areaTree"), treeSettings);
5、擷取tree選中的值。
function getSelectedTreeAreaIds() {
var selectAreaIds = new Array();
var tree = $.fn.zTree.getZTreeObj('areaTree');
var treeData = tree.getCheckedNodes(true);
if (treeData.length != 0) {
for (var i = 0; i < treeData.length; i++) {
selectAreaIds.push(treeData[i].Id);
if (treeData[i].level == 0) {
//前提,地區樹的頂級是market大區
selectedMarketAreaCount++;
}
}
}
return selectAreaIds;
};
6、将tree多選中的值傳遞給MVC model的string字段,此時,js将數組預設轉變成用逗号連接配接的string,便于form送出,傳遞給背景。
var selectedTreeAreas = getSelectedTreeAreaIds();
$("#userArea").val(selectedTreeAreas);
7、背景接口資料
#region 地區 tree
public JsonResult GetAreasTree(string userId,string roleName)
{
List<Area> allAreas = _commonService.GetAreas().ToList();
if (_commonService.GetRoleNamesCannotSelectDistrict().Contains(roleName))
{
allAreas = allAreas.Where(m => m.Category != (int)AreaCategoryEnum.District).ToList();
}
List<int> allCheckedItemIds = _commonService.GetUserAreaIdNew(userId);
var areaTreeData = GetChildren(allAreas, allCheckedItemIds, 0);
return Json(areaTreeData, JsonRequestBehavior.AllowGet);
}
private List<KendoTreeModel> GetChildren(List<Area> allItems,List<int> allCheckedItemIds, int parentId)
{
List<KendoTreeModel> models = new List<KendoTreeModel>();
var sonItems = allItems.FindAll(c => c.ParentId == parentId).OrderBy(c => c.SortNumber);
foreach (var son in sonItems)
{
var kendoTreeModel = new KendoTreeModel()
{
Id = son.Id,
Name = son.Text,
Expanded = son.ParentId.GetValueOrDefault() != 1,
IsChecked = allCheckedItemIds.Contains(son.Id),
Items = GetChildren(allItems, allCheckedItemIds, son.Id),
};
kendoTreeModel.IsParent = kendoTreeModel.Items.Any();
models.Add(kendoTreeModel);
}
return models;
}
#endregion
8、節點Model
public class KendoTreeModel
{
public int Id { set; get; }
public int ParentId { set; get; }
public string Name { set; get; }
public bool IsChecked { set; get; }
public bool IsParent { get; set; }
public bool Expanded { set; get; }
public List<KendoTreeModel> Items { set; get; }
}
轉載于:https://www.cnblogs.com/taoshengyujiu/p/10061807.html