效果图:
案例一下载地址:http://download.csdn.net/detail/lovegonghui/9254347
数据库说明
classId
className
classDescrip
parentId,父级编号,顶级为0
sortId,排序编号,
删除的时候,把sortId大于此编号的,全部减一。
增加的时候,在最大编号上加一。
上移的时候,与前面交换sortId,先判断是否已经是最前了。即是否为0
下移的时候,与后面交换sortId,先判断是否已经是最后了。即是否为childNum+1
depth,深度,0为顶级。
childNum,子级数量,0为没有。
增加操作
1.如果是顶级,则parentId=0,depth=0
sortId,按最大值
2.如果有父级,则操作父级,childNum增1
sortId,按childNum+1,depth为父级depth+1
删除操作
1.判断是否有子类,即parentId=当前classId,有则不可删除。
2.无,则判断是否是顶级。有父级,则父级childNum减1. 找到sortId,把父级sortId大于此的减1
关键代码:
///
/// 增加同级
///
///
///
protected void imgBtnAddNode_Click(object sender, ImageClickEventArgs e)
{
if (tvType.SelectedNode != null)
{
if (tvType.SelectedValue != "-1")//根结点不算
bodyUrl = "body.aspx?type=add&classId=" + tvType.SelectedValue;
}
else
Page.ClientScript.RegisterStartupScript(this.GetType(), "show", "alert('请选择类别!');;", true);
}
///
/// 增加子级
///
///
///
protected void imgBtnAddChildNode_Click(object sender, ImageClickEventArgs e)
{
if (tvType.SelectedNode != null)
{
bodyUrl = "body.aspx?type=addChild&classId=" + tvType.SelectedValue;
}
else
Page.ClientScript.RegisterStartupScript(this.GetType(), "show", "alert('请选择类别!');;", true);
}
///
/// 删除
///
///
///
protected void imgBtnDeleteNode_Click(object sender, ImageClickEventArgs e)
{
if (tvType.SelectedNode != null)
{
if (tvType.SelectedNode == tvType.Nodes[0])
{
Page.ClientScript.RegisterStartupScript(this.GetType(), "show", "alert('根结点不能删除');", true);
return;
}
if (!classes.HasChild(Convert.ToInt32(tvType.SelectedValue)))
{
//先把同级重新排序
DataTable dt = classes.GetByClassId(Convert.ToInt32(tvType.SelectedValue));
classes.UpdateSort(Convert.ToInt32(dt.Rows[0]["sortId"].ToString()), Convert.ToInt32(dt.Rows[0]["parentId"].ToString()));
classes.UpdateChildNum(Convert.ToInt32(dt.Rows[0]["parentId"].ToString()), false);
//再删除
classes.DeleteClass(Convert.ToInt32(tvType.SelectedValue));
Response.Redirect("tree.aspx");
}
else
Page.ClientScript.RegisterStartupScript(this.GetType(), "show", "alert('请先删除子级!');;", true);
}
else
Page.ClientScript.RegisterStartupScript(this.GetType(), "show", "alert('请选择类别!');;", true);
}
///
/// 上移
///
///
///
protected void imgBtnUp_Click(object sender, ImageClickEventArgs e)
{
if (tvType.SelectedNode != null)
{
if (tvType.SelectedNode == tvType.Nodes[0])
{
Page.ClientScript.RegisterStartupScript(this.GetType(), "show", "alert('根结点不能移动');", true);
return;
}
DataTable dt = classes.GetByClassId(Convert.ToInt32(tvType.SelectedValue));
DataTable dtUp = classes.GetUpDown(Convert.ToInt32(tvType.SelectedValue), true);
if (dt.Rows[0]["sortId"].ToString() != "0")
{
classes.ChangeSort(Convert.ToInt32(dt.Rows[0]["classId"].ToString()), true);
classes.ChangeSort(Convert.ToInt32(dtUp.Rows[0]["classId"].ToString()), false);
Response.Redirect("tree.aspx");
}
else
Page.ClientScript.RegisterStartupScript(this.GetType(), "show", "alert('已经排在上面!');", true);
}
else
Page.ClientScript.RegisterStartupScript(this.GetType(), "show", "alert('请选择类别!');;", true);
}
///
/// 下移
///
///
///
protected void imgBtnDown_Click(object sender, ImageClickEventArgs e)
{
if (tvType.SelectedNode != null)
{
if (tvType.SelectedNode == tvType.Nodes[0])
{
Page.ClientScript.RegisterStartupScript(this.GetType(), "show", "alert('根结点不能移动');", true);
return;
}
DataTable dt = classes.GetByClassId(Convert.ToInt32(tvType.SelectedValue));
DataTable dtDown = classes.GetUpDown(Convert.ToInt32(tvType.SelectedValue), false);
if (dtDown.Rows.Count > 0)
{
classes.ChangeSort(Convert.ToInt32(dt.Rows[0]["classId"].ToString()), false);
classes.ChangeSort(Convert.ToInt32(dtDown.Rows[0]["classId"].ToString()), true);
Response.Redirect("tree.aspx");
}
else
Page.ClientScript.RegisterStartupScript(this.GetType(), "show", "alert('已经排在下面!');", true);
}
else
Page.ClientScript.RegisterStartupScript(this.GetType(), "show", "alert('请选择类别!');;", true);
}
///
/// 最简单的无限级绑定,这里的效率需要改进
///
///
///
private void PopulateTreeView(int parentId, TreeNode parentNode)
{
DataView dv = classes.GetClass("parentId=" + parentId.ToString()).DefaultView;
foreach (DataRowView drv in dv)
{
TreeNode myNode = new TreeNode(drv["className"].ToString());
//myNode.Expanded = false;
myNode.Value = drv["classId"].ToString();
myNode.Target = "bodyFrame";
myNode.NavigateUrl = "body.aspx?classId=" + drv["classId"].ToString();
parentNode.ChildNodes.Add(myNode);
PopulateTreeView(Convert.ToInt32(drv["classId"].ToString()), myNode);
}
}
运行效果图:
案例二下载地址:http://download.csdn.net/detail/lovegonghui/9272251
1:支持静态的树,即一次性将全部数据加载到客户端。
2:异步树,即一次只加载一级或若干级节点,子节点可以异步加载数据。
3:Checkbox树(可能是静态树也可能是异步树),用于选择(如选择组织机构,选择数据字典项)等,最好是能够支持节点级联(这个是难点)
4:能够承载大数据量,并性能表现优异
5:能够在主流浏览器中运行良好
运行效果图:
案例三下载地址:http://download.csdn.net/detail/lovegonghui/9276491
运行效果图:
案例四下载地址:http://download.csdn.net/detail/lovegonghui/9280111