.NET 树形菜单的实现
先上最终图
分为 h5的代码 js的代码 和后台代码
h5的代码内容 要把 树形菜单“画”出来
然后就是js事件
需要引用两个js文件,请自行下载
然后就是对一些事件的实现的js代码
接下来就是 后台代码的实现
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
switch (Request["Type"])
{
case "tree_Demo":
var result = DtToJson(null);
Response.Write(result);
Response.End();
break;
case "Read": //查看结点详情
Read();
break;
case "Remove": //删除结点
Response.Write(DataRemove(Request["arid"]));
break;
case "Cut": //剪切结点
ChangeFatherNode();
break;
default:
//string s = DtToJson(null);
//this.ClientScript.RegisterStartupScript(this.GetType(), "DZL", "");
break;
}
}
}
protected string DtToJson(string Type)
{
string result = string.Empty;
string ParentID = string.Empty;
switch (Type)
{
case null://首次传进来是空的
{
result += CreateParent();
break;
}
}
if (result.Length > 0)
result = "[rn" + result.Substring(1) + "rn]";
JavaScriptSerializer json = new JavaScriptSerializer();
return json.Serialize(new { value = result });
}
protected class AreaList
{
public int id { get; set; }
public string name { get; set; }
public string abbreviation { get; set; }
public string pinyin_Abbreviation { get; set; }
public int area_Type { get; set; }
public string parent_Area { get; set; }
public bool is_Provincial_Capital { get; set; }
public int Count { get; set; }
}
///
/// 创建顶级节点
///
///
protected string CreateParent()
{
using (new DataContextScope())
{
string parentNode = string.Empty;
string IsParent = string.Empty;
AreaManageBLL areabll = new AreaManageBLL();
var areas = areabll.getAllArea().Where(d => d.parent_Area == "-1");
foreach (var ar in areas)
{
IsParent = "false";
var menu = from q in areabll.getAllArea()
where q.parent_Area == ar.id.ToString()
select q;
if (menu.Count() > 0)
{
IsParent = "true";
}
parentNode += ",rn{id:'" + ar.id.ToString() + "',pId:'0',name:'" + ar.name
+ "',region:'" + ar.parent_Area + "',open:false,isParent:" + IsParent + "}";
var groupList = from q in areabll.List()
join child in areabll.List()
on q.id.ToString() equals child.parent_Area
group q by q.id into g
select new
{
g.Key,
Count = g.Count()
};
var AreaList = from q in areabll.List()
join g in groupList on q.id equals g.Key
into tempList
from gList in tempList.DefaultIfEmpty()
select new AreaList
{
id = q.id,
name = q.name,
abbreviation = q.abbreviation,
pinyin_Abbreviation = q.pinyin_Abbreviation,
area_Type = q.area_Type,
parent_Area = q.parent_Area,
is_Provincial_Capital = q.is_Provincial_Capital,
Count = gList == null ? 0 : gList.Count,
};
parentNode += CreateChild(AreaList, ar.id.ToString());
}
return parentNode;
}
}
///
/// 创建子节点
///
/// 数据筛选集合
/// 父节点ID
/// JSON拼接的节点信息
protected string CreateChild(IQueryable AreaList, string Parentorg_id)
{
string IsParent = string.Empty;
string parentNode = string.Empty;
var ChildList = from q in AreaList
where q.parent_Area == Parentorg_id
orderby q.name
select q;
var theOrg_id = string.IsNullOrEmpty(Request["arid"]) ? "" : Request["arid"]; //传过来的结点ID
foreach (var child in ChildList)
{
if (child.id.ToString() != theOrg_id) //为了不显示这个菜单
{
IsParent = "false";
if (child.Count > 0)
IsParent = "true";
parentNode += ",rn{id:'" + child.id.ToString() + "',pId:'" + Parentorg_id + "',name:'"
+ child.name + "',region:'" + child.parent_Area + "',isParent:" + IsParent + "}";
parentNode += CreateChild(AreaList, child.id.ToString());
}
}
return parentNode;
}
public void Read()
{
string errinfo = string.Empty;
string tableHtml = string.Empty;
if (string.IsNullOrEmpty(Request["arid"]))
{
errinfo = "没有传递结ID!";
}
else
{
T_Area ar = new T_Area();
AreaManageBLL areaBll = new AreaManageBLL();
var area = areaBll.getAreaById(Request["arid"]);
if (area == null)
{
errinfo = "该组织信息不存在!";
}
else
{
var ParentAreaInfo = areaBll.getAreaById(area.parent_Area);
var name = "";
if (ParentAreaInfo != null)
{
name = ParentAreaInfo.name;
}
tableHtml = "";
tableHtml += "区域编码 " + area.area_Code + " 区域名称 " + area.name + " 区域缩写 " + area.pinyin_Abbreviation + " ";
tableHtml += "区域拼音缩写 " + area.abbreviation + " 区域类型 " + DictionaryBll.GetObjectText("areaType", area.area_Type) + " 所属上级区域名称 " + name + " ";
tableHtml += "是否省会 " + (area.is_Provincial_Capital == false ? "否" : "是") + " ";
tableHtml += "
";
}
}
Response.Write(errinfo == "" ? tableHtml : errinfo);
Response.End();
}
///
/// 删除
///
protected string DataRemove(string ID)
{
AreaManageBLL areaBll = new AreaManageBLL();
string str = "";
var childList = areaBll.List().Where(p => p.parent_Area == ID);
if (childList.Count() > 0)
{
str = "该组织节点下存在子节点,请确保该节点下子节点为空,再删除该节点!";
}
else
{
var area = areaBll.getAreaById(ID);
area.status = 3;
areaBll.SaveArea(area);
str = "OK";
}
return str;
}
///
/// 剪切
///
protected void ChangeFatherNode()
{
string Status = string.Empty, Error = string.Empty;
if (!string.IsNullOrEmpty(Request["theOrgID"]) && !string.IsNullOrEmpty(Request["aimOrgID"]))
{
int ID = int.Parse(Request["theOrgID"]);
string NewParentorg_id = Request["aimOrgID"];
AreaManageBLL areabll = new AreaManageBLL();
var area = areabll.getAreaById(Request["theOrgID"]);
area.parent_Area = NewParentorg_id; //设置为新值
//Area_Edit ePage = new Area_Edit();
//area.area_Code = ePage.AddTraverseCode(area.parent_Area);
try
{
areabll.SaveArea(area);
Status = "Success";
}
catch (Exception ex)
{
Status = "Fail";
Error = ex.Message;
}
}
Response.Write("{"Status":" + Status + ","Error":" + Error + "}");
}
还有一个新增编辑的方法 不在这里 页面需要单独画 到这其实就能实现基本的增删改查 还有剪切功能。



