动态生成树型结构方法

动态生成树型结构方法

 

一个分类体系,比如将所有列车第一分类,车厢作为第二级别分类,车厢里面的排作为第三级分类……等等,这样就可以统一在一个表里面实现,比如:  
0001列车一  
00010001列车一车厢一  
000100010001列车一车厢一排一  
000100010002列车一车厢一排二  
00010002列车一车厢二  
000100020001列车一车厢二排一  
0002列车二  
00020001列车二车厢一  
.....  

 

    protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
BindDataBase(); //调用BindDataBase方法
tb.ShowLines = true;//显示连接父节点与子节点间的线条
tb.ExpandDepth = 1;//控件显示时所展开的层数


}
l1.Text = "层次" + tb.SelectedValue;

    }

    #region 计算id编码的节点的层次  001 为一层 001001为二层

 

    private int levelCount(string str)
{
//string delimStr = "_";
//char[] delimiter = delimStr.ToCharArray();
//string[] split = null;
//split = str.Split(delimiter);
//return split.Length;
int deepth = str.Length / 3;
return deepth;
}
#endregion

    #region 将数据库的数据存入DataSet


private DataSet GetFuncAll()
{
SqlConnection sqlCon = new SqlConnection();
//实例化SqlConnection对象连接数据库的字符串
sqlCon.ConnectionString = @"server=JONKIKY/SQLEXPRESS;uid=sa;pwd=123456;database=treetext;Trusted_Connection=True";
//实例化SqlDataAdapter对象

        SqlDataAdapter da = new SqlDataAdapter("select * from  Func order by FuncID asc", sqlCon);

        DataSet ds = new DataSet();
da.Fill(ds, "Func");
return ds;
}

    #endregion

    #region 生成树tewwview

    public void BindDataBase()
{
DataSet ds = GetFuncAll(); //得到数据库的数据

        TreeNode tree2 = null;
TreeNode tree3 = null;
//  TreeNode NodeLast= null;
int LevelLast = 0;  //当前节点所在的层次
int nLevel;     //得到的节点的层次
string sTitle;  //节点的内容
TreeNode tree1 = new TreeNode("技能交换"); //Root根节点
this.tb.Nodes.Add(tree1);

        for (int i = 0; i < ds.Tables["Func"].Rows.Count; i++)
{

            nLevel = levelCount(ds.Tables["Func"].Rows[i]["FuncID"].ToString());
sTitle = Convert.ToString(ds.Tables["Func"].Rows[i]["FuncTitle"]) + ds.Tables["Func"].Rows[i]["FuncID"].ToString() + "*" + nLevel + "*" + LevelLast;

            //写入节点的级别与上一个节点级别相同 加入兄弟节点
if (nLevel == LevelLast)
{
tree3 = new TreeNode(sTitle);
tree3.Text = ds.Tables["Func"].Rows[i]["FuncTitle"].ToString();
tree3.Value = ds.Tables["Func"].Rows[i]["FuncID"].ToString();
tree2.Parent.ChildNodes.Add(tree3);
tree2 = tree3;

            }
//写入节点的级别大于上一个节点级别大一个级别
else if (nLevel > LevelLast)
{
//写入节点是根节点
if ((tree1.Value == "技能交换") && (tree2 == null))
{
tree2 = new TreeNode(sTitle);
tree2.Text = ds.Tables["Func"].Rows[i]["FuncTitle"].ToString();
tree2.Value = ds.Tables["Func"].Rows[i]["FuncID"].ToString();
tree1.ChildNodes.Add(tree2);

                }
else//写入节点不是是根节点
{

                    tree3 = new TreeNode(sTitle);
tree3.Text = ds.Tables["Func"].Rows[i]["FuncTitle"].ToString();
tree3.Value = ds.Tables["Func"].Rows[i]["FuncID"].ToString();
tree2.ChildNodes.Add(tree3);

                    tree2 = tree3;//定位到该节点!!!!!!!!!!!!

                }

            }
else
{   //写入节点的级别小于上一个节点级别小一个或多个级别
while (nLevel < LevelLast)
{
tree2 = tree2.Parent;//寻找其父节点
LevelLast = LevelLast - 1;
}
//写入节点是根节点
if (tree2.Parent.Value == "技能交换")
{
tree2 = new TreeNode(sTitle);
tree2.Text = ds.Tables["Func"].Rows[i]["FuncTitle"].ToString();
tree2.Value = ds.Tables["Func"].Rows[i]["FuncID"].ToString();
tree1.ChildNodes.Add(tree2);
}
else
//写入节点不是根节点
{
tree3 = new TreeNode(sTitle);
tree3.Text = ds.Tables["Func"].Rows[i]["FuncTitle"].ToString();
tree3.Value = ds.Tables["Func"].Rows[i]["FuncID"].ToString();
tree2.Parent.ChildNodes.Add(tree3);
tree2 = tree3;
}

            }
LevelLast = nLevel; //获取当前的节点层次

        }

    }
#endregion


protected void tb_SelectedNodeChanged(object sender, EventArgs e)
{

    }

    private bool check()
{
if ((content.Text == null) || (tb.SelectedValue == null))
{
return false;
}
else
{
return true;
}
}

    protected void add_Click(object sender, EventArgs e)
{
string skillname = content.Text.ToString();
string rootid = tb.SelectedValue;


SqlConnection sqlCon = new SqlConnection();
//实例化SqlConnection对象连接数据库的字符串
sqlCon.ConnectionString = @"server=JONKIKY/SQLEXPRESS;uid=sa;pwd=123456;database=treetext;Trusted_Connection=True";
sqlCon.Open();

        if (check())
{

            string cmdtxt2 = "select * from func where funcid like '" + rootid + "'+'___'";

            SqlCommand com = new SqlCommand(cmdtxt2, sqlCon);

            SqlDataReader read = com.ExecuteReader();
int i = 0;
while (read.Read())
{
i++;
}

            i = i + 1;
string t = string.Format("{0:D3}", i);
string addid = rootid + t;
read.Close();
string cmdtxt = "insert into func (FuncID,FuncTitle)";
cmdtxt += "values('" + addid + "','" + skillname + "')";
SqlCommand com2 = new SqlCommand(cmdtxt, sqlCon);
int read2 = com2.ExecuteNonQuery();
Response.Write(i);
sqlCon.Close();
if (read2 == -1)
{
Response.Write("<script language=javascript>alert('添加失败2');location='javascript:history.go(-1)'</script>");
}
else
{

                Response.Write("<script language=javascript>alert('添加成功');location='Default.aspx'</script>");
}


}
else
{
Response.Write("<script language=javascript>alert('添加失败没');location='javascript:history.go(-1)'</script>");
}


}
protected void delete_Click(object sender, EventArgs e)
{
string skillname = content.Text.ToString();
string rootid = tb.SelectedValue;
SqlConnection sqlCon = new SqlConnection();
//实例化SqlConnection对象连接数据库的字符串
sqlCon.ConnectionString = @"server=JONKIKY/SQLEXPRESS;uid=sa;pwd=123456;database=treetext;Trusted_Connection=True";
sqlCon.Open();

        if (check())
{

            string cmdtxt2 = "delete from func where funcid ='" + rootid + "'";

            SqlCommand com = new SqlCommand(cmdtxt2, sqlCon);
int result = com.ExecuteNonQuery();

            if (result == -1)
{
Response.Write("<script language=javascript>alert('删除失败2');location='javascript:history.go(-1)'</script>");
}
else
{

                Response.Write("<script language=javascript>alert('删除成功');location='Default.aspx'</script>");
}


}

        else
{
Response.Write("<script language=javascript>alert('删除失败没');location='javascript:history.go(-1)'</script>");
}

    }
protected void alter_Click(object sender, EventArgs e)
{
string skillname = content.Text.ToString();
string rootid = tb.SelectedValue;
SqlConnection sqlCon = new SqlConnection();
//实例化SqlConnection对象连接数据库的字符串
sqlCon.ConnectionString = @"server=JONKIKY/SQLEXPRESS;uid=sa;pwd=123456;database=treetext;Trusted_Connection=True";
sqlCon.Open();

        if (check())
{

            string cmdtxt2 = "update func";
cmdtxt2 += " set FuncTitle= '" + skillname + "'";
cmdtxt2 += " where funcid ='" + rootid + "'";

            SqlCommand com = new SqlCommand(cmdtxt2, sqlCon);
int result = com.ExecuteNonQuery();

            if (result == -1)
{
Response.Write("<script language=javascript>alert('修改失败2');location='javascript:history.go(-1)'</script>");
}
else
{

                Response.Write("<script language=javascript>alert('修改成功');location='Default.aspx'</script>");
}


}

        else
{
Response.Write("<script language=javascript>alert('修改失败没');location='javascript:history.go(-1)'</script>");
}


}


}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
生成树结构通常可以使用递归算法,以下是一个示例代码: 假设我们有一个如下的路径字符串: ```java String path = "/a/b/c/d"; ``` 我们希望将其转换为如下的树结构: ``` a └── b └── c └── d ``` 可以使用以下的代码实现: ```java import java.util.ArrayList; import java.util.List; public class TreeGenerator { public static void main(String[] args) { String path = "/a/b/c/d"; Node rootNode = generateTree(path); System.out.println(rootNode.toString()); } public static Node generateTree(String path) { String[] pathArray = path.split("/"); Node rootNode = new Node(pathArray[1]); Node currentNode = rootNode; for (int i = 2; i < pathArray.length; i++) { Node childNode = new Node(pathArray[i]); currentNode.addChild(childNode); currentNode = childNode; } return rootNode; } static class Node { private String name; private List<Node> children = new ArrayList<>(); public Node(String name) { this.name = name; } public void addChild(Node child) { children.add(child); } @Override public String toString() { return toString(0); } private String toString(int level) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < level; i++) { sb.append(" "); } sb.append(name).append("\n"); for (Node child : children) { sb.append(child.toString(level + 1)); } return sb.toString(); } } } ``` 该代码会输出以下内容: ``` a b c d ``` 其中,`Node` 类表示树中的节点,`generateTree` 方法用于将路径字符串转化为树结构,`toString` 方法用于将树结构转化为字符串。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值