easyui官网有简单的实例,但是项目中需要加载全国的区域,一次性加载容易造成页面加载过慢和卡死,所以需要动态加载
最后效果
textarea 显示效果
首先是引入jquery和easyui的js
页面上需要渲染的控件
加载combotree的js
cascabeCheck这个参数,我设置了false,但是无效,原因未知
onBeforeExpand节点展开时触发,动态加载在此处实现
loadFilter筛选显示值
//获取树形图区域
function loadRegionTree() {
//动态加载
$('#selAdminRegion').combotree({
url: "/Project/GetThreeRegionTree?parentRegionCode=",
width: '583',
multiple: true,//增加复选框
checkbox: true,
cascabeCheck: false,//选中父节点,是否选中子节点
loadFilter: function (data) {
return data;
},
formatter: function (node) {
return node.text;//显示文字内容
},
onChange: function (node) {
//点击事件,给隐藏内容赋值
setAdminRegion();
},
onBeforeExpand: function (node) {
if (node.children === null || node.children === undefined) {
$('#selAdminRegion').combotree('tree').tree('options').url = '/ExpertSelection/MyProject/GetThreeRegionTree?parentRegionCode=' + node.id;
}
},
onLoadSuccess: function (data) {
//多选框赋值,如果选择了二、三级菜单,菜单第一次加载的是一级菜单,会直接显示二三级的编码,所以赋值显示内容为空
$('#selAdminRegion').combotree('setText', "");
}
});
}
如果已有选中值的话,加载需要给下拉框赋值,多选框赋值使用setValues参数,值为数组
//设置下拉框选中
function setComBoxChecks() {
var treeCheckStr = $("#AdministrativeRegion").val();
var treeCheckList = treeCheckStr.split(';');
var checkTreesStr = "";
for (var i = 0; i < treeCheckList.length; i++) {
checkTreesStr = checkTreesStr + "," + treeCheckList[i];
}
var subLength = checkTreesStr.length;
checkTreesStr = checkTreesStr.substring(1, subLength);
var checkTreeArr = checkTreesStr.split(',');
//多选框赋值
$('#selAdminRegion').combotree('setValues', checkTreeArr);
}
我的是重新给了个textarea 把区域名称显示在此处
js字符串给textarea 换行时,换行符为rn
给下拉框的文本框赋值
$(’#selAdminRegion’).combotree(‘setText’, “”);
//设置所在行政区域
function setAdminRegion() {
var getTreeChecks = $('#selAdminRegion').combobox('getValues'); //获取多选
var getTreeCheckStr = getTreeChecks.toString().replace(/,/gm, ";");//获取的下拉框选择值为英文逗号分割,替换为英文分号
setRegionCodes(getTreeCheckStr);
//取新的隐藏控件值
var adminRegions = $("#AdministrativeRegion").val();
//给多行输入框赋值
$.post("/Project/GetRegionNamesByRegionCodes", { regions: adminRegions }, function (data) {
//多选框赋值,如果选择了二、三级菜单,菜单第一次加载的是一级菜单,所以会直接显示二三级的编码,所以重新赋值
$('#selAdminRegion').combotree('setText', "");
//rn textarea换行符
$("#txtAreaNames").val(data.replace(/"/gm, "").replace(/;/gm, "rn"));
}, "text");
}
因为是动态加载,如果已经编辑过,再次修改时,只会默认加载第一级区域,之前选中的二三级区域,未展开父节点时,是不会被获取为选中项的,所以只有在确认当前原有节点已被展开,并且选中状态为未选中时,才被替换
//设置选中项的id值,赋给隐藏控件
function setRegionCodes(getTreeCheckStr) {
var adminRegions = $("#AdministrativeRegion").val();
var regionArr = adminRegions.split(';');
//因为是动态加载,已存在但是节点未展开的区域,获取所有选中节点时,获取不到,所以这里处理
for (var i = 0; i < regionArr.length; i++) {
debugger;
//获取id为110101的节点
var currentNode = $('#selAdminRegion').combotree('tree').tree('find', regionArr[i]);
//如果从节点获取不到,证明当前节点未展开或不存在,依然保存当前节点
if (currentNode == null || currentNode == undefined) {
//如果该节点已存在在字符串中,不再添加
if (getTreeCheckStr.indexOf(regionArr[i]) == -1) {
getTreeCheckStr = getTreeCheckStr + ";" + regionArr[i];
}
}
}
$("#AdministrativeRegion").val(getTreeCheckStr);
}
后端代码
获取区域节点信息
////// 获取三级区域菜单 /// ///public ActionResult GetThreeRegionTree(string parentRegionCode = "") { List treeOneList = new List (); var treeListModel = Sys_RegionServer.GetRegionChildList(parentRegionCode); foreach (var oneTreeItem in treeListModel) { TreeRegionOne treeOne = new TreeRegionOne(); treeOne.id = Convert.ToInt32(oneTreeItem.Value);//下拉框value值 treeOne.text = oneTreeItem.Text;//显示文本 treeOne.state = "open";//显示的是文件夹样式还是文档样式,也就是是否最后一级 //是否有子节点 var childList = Sys_RegionServer.GetRegionChildList(oneTreeItem.Value); if (childList != null && childList.Count() > 0) { treeOne.state = "closed"; } treeOneList.Add(treeOne); } return Json(treeOneList); }
这里是展示在textarea中的区域名称
////// 根据区域编码返回拼接好的完整区域字符串 /// /// public ActionResult GetRegionNamesByRegionCodes(string regions = "") { string regionNamesStr = GetRegionNameStrByRegionCodes(regions); return Json(regionNamesStr, JsonRequestBehavior.AllowGet); } ////// 根据区域编码返回拼接好的完整区域字符串 /// /// public string GetRegionNameStrByRegionCodes(string regions = "") { string regionNamesStr = ""; string[] regionCodes = regions.Split(';'); foreach (var regionItem in regionCodes) { string currentStr = ""; string currentRegionName = Sys_RegionServer.GetRegionName(regionItem); //拼接当前节点 currentStr += currentRegionName; Sys_Region parentRegionModel = Sys_RegionServer.GetParentRegionByRegionCode2(regionItem); if (parentRegionModel != null) { //拼接父级节点 currentStr = parentRegionModel.RegionName + "-" + currentStr; Sys_Region topRegionModel = Sys_RegionServer.GetParentRegionByRegionCode2(parentRegionModel.RegionCode); if (topRegionModel != null) { //区域一共三级,拼接顶级节点 currentStr = topRegionModel.RegionName + "-" + currentStr; } } currentStr = ";" + currentStr; regionNamesStr += currentStr; } if (!string.IsNullOrWhiteSpace(regionNamesStr)) { regionNamesStr = regionNamesStr.Substring(1, regionNamesStr.Length - 1); } return regionNamesStr; }
加一个注意点
在使用aspx页面渲染combotree时,url路径一定要是一般处理程序的路径,而不能直接写.cs里的方法,不然可能combotree的样式无法加载,就只是一个普通的文本框。
参考链接
easyui官网:
https://www.jeasyui.net/plugins/170.html
如何让easyui combox默认选中多项及一些主要参数:
https://www.cnblogs.com/Archosaur/archive/2013/01/21/EasyUI-ComBox-setValues.html
默认节点选中:
https://blog.csdn.net/sat472291519/article/details/53584719
easyui的tree节点的获取和选中:
https://www.136.la/tech/show-382487.html
jquery 获取easyui combobox选中的值、赋值:
https://www.cnblogs.com/xbblogs/p/6076371.html
combobox筛选显示值:
https://blog.csdn.net/lindiwo/article/details/75043428



