使用递归算法实现DropDownList下拉框中显示树状图
程序开发
2023-09-23 23:10:36
DropDownList下拉框中显示树状图
DropDownList下拉框中显示树状图
在.NET中有的时候需要下框中显示树状图,其实无论是TreeView控件还是DropDownList控件,树状图的基本思路就是递归算法,自己调用自己,直到加载完数据库中所有的列,效果如图:
数据库:
需要用到的字段是:CategoryID(列ID)、CategoryName(分类名)、ParentCategoryID(父类ID)
实现思路:树状图是根据ParentCategoryID来判断我是谁的子目录,观察数据库你会发现子目录的ParentCategoryID对应了根目录的CategoryID,例如:文具是所有笔的根目录,所以所有的笔ParentCategoryID=CategoryID(文具)=29,当后台在执行循环的时候就是根据这一条件来判断列名是子目录还是根目录,所有根目录的ParentCategoryID=0,当你想明白了这一点,那么树状图就会变得很容易了。
话不多说,直接上代码
前台代码就一个DropDownList:
后台代码:
protected void Page_Load(object sender, EventArgs e){//判断窗体是否为首次加载if (!IsPostBack){//实例化对象//解决方案.BLL层.数据库表名();//实例化后sm就代表着base_Category表字段和方法var ds = new Manage.BLL.base_Category();//GetList("")是我定义的一个方法,查询表中的数据,""代表条件为空//查询所有数据DataTable dt = ds.GetList("").Tables[0];//将DropDownList中清空this.ddFenL.Items.Clear();//加载树//首先自己在后台给树状图加一个标签,也就是根目录this.ddFenL.Items.Add(new ListItem("根目录", "0"));//Select("条件")是一个查询方法,ParentCategoryID= 0 是条件//当ParentCategoryID= 0 时也就意味着该目录是根目录DataRow[] drs = dt.Select("ParentCategoryID= 0 and Del=0");//第一个foreach循环,遍历drs查询出来的结果,将所有根目录全部加载出来foreach (DataRow r in drs){//将表中分类名和列ID赋值给变量nodeid,textstring CID = r["CategoryID"].ToString();string CName = r["CategoryName"].ToString();//在text也就是列名前面加一个符号,更加有层次感CName = "╋" + CName;//将两个变量通过Add方法赋值给DropDownListthis.ddFenL.Items.Add(new ListItem(CName, CID));//将列名ID赋值给一个变量,等一下要将ID传递给加载子目录的方法中int CategoryID = int.Parse(CID);//这是子目录前面的符号string text1 = "├";//调用加载子目录方法,传递列名ID,dt,text1BindNode(CategoryID, dt, text1);}this.ddFenL.DataBind();}}#region 绑定菜单private void BindNode(int CategoryID, DataTable dt, string text1){//将传递过来的根目录ID作为条件查询//这里的条件是ParentCategoryID=CategoryID,就是前面说到的子目录ParentCategoryID对应父目录CategoryIDDataRow[] drs = dt.Select("ParentCategoryID= " + CategoryID + "and Del=0");//父菜单Id//第二个foreach循环以根目录ID作为条件加载出子目录//以后面试官问你5层树需要几个循环可千万别说五个循环//不管多少层树,只要两个foreach循环即可搞定foreach (DataRow r in drs){//这里的话就是依葫芦画瓢啦,就不详细讲了string CID = r["CategoryID"].ToString();//菜单Idstring CName = r["CategoryName"].ToString();//菜单名称CName = text1 + "『" + CName + "』";this.ddFenL.Items.Add(new ListItem(CName, CID));int CategoryID = int.Parse(CID);string text2 = text1 + "─";//递归BindNode(CategoryID, dt, text2);}}#endregion
总结:
当时我第一次接触到树状图的时候也是一头雾水,不明白其中的关系,直接用的XML绑定树状图,但是那样的话就把树状图写死了,不能根据数据库中的字段灵活改变,后来看了一篇详细的文章,才算是搞懂其中的关系,其实主要是要理解其中的原理,了解递归算法,不要复制了代码就大功告成,不理解其中的原理还是容易遗忘,如果你有更好的方法也可以私信给我一起交流,写完啦!!!
标签:
上一篇:
npm版本兼容问题
下一篇:
相关文章
-
无相关信息