主要使用递归实现,数据库结构:

最终样式:

 1protected void Page_Load(object sender, EventArgs e)
 2    {
 3        if (!Page.IsPostBack)
 4        {
 5            BindDrpClass();
 6        }
 7    }
 8    //绑定顶级分类
 9    private void BindDrpClass()
10    {
11        Bll.Class classSystem = new Bll.Class();
12        DataTable dt = classSystem.GetClassList("").Tables[0];
13        ddlClass.Items.Clear();
14        ddlClass.Items.Add(new ListItem("添加根栏目","0"));
15        DataRow[] drs = dt.Select("ParentID= " + 0);
16
17        foreach (DataRow dr in drs)
18        {
19            string classid = dr["ClassID"].ToString();
20            string classname = dr["ClassName"].ToString();
21            //顶级分类显示形式
22            classname = "╋" + classname;
23
24            ddlClass.Items.Add(new ListItem(classname, classid));
25            int sonparentid = int.Parse(classid);
26            string blank = "├";
27            //递归子分类方法
28            BindNode(sonparentid, dt, blank);
29        }
30        ddlClass.DataBind();
31    }
32    //绑定子分类
33    private void BindNode(int parentid, DataTable dt, string blank)
34    {
35        DataRow[] drs = dt.Select("ParentID= " + parentid);
36
37        foreach (DataRow dr in drs)
38        {
39            string classid = dr["ClassID"].ToString();
40            string classname = dr["ClassName"].ToString();
41
42            classname = blank + classname;
43            ddlClass.Items.Add(new ListItem(classname, classid));
44
45            int sonparentid = int.Parse(classid);
46            string blank2 = blank + "─";
47
48            BindNode(sonparentid, dt, blank2);
49        }
50    }

源码下载:

http://files.cnblogs.com/chensubo/RecursionDemo.rar

改造过的函数

// <asp:DropDownList ID="editparentid"  runat="server" ></asp:DropDownList>

  1.  
  2.    /// <summary>
  3.     ///  加载页面 
  4.     ///</summary>
  5.     protected void Page_Load(object sender, EventArgs e)
  6.     {
  7.        BindDrpClass(editparentid);}

/// <summary>

  1.  
  2. /// 创建树
  3.     /// </summary>
  4.     public void BindDrpClass(DropDownList ddlClass)
  5.     {
  6.         DataTable dt = DbHelper.ExecuteDataset(SysConst.DBNAME_XIAOWU, "select * from NT_Clcs_ClientType").Tables[0];
  7.         ddlClass.Items.Clear();
  8.         ddlClass.Items.Add(new ListItem("添加根栏目", "0"));
  9.         DataRow[] drs = dt.Select("ParentID= " + 0);
  10.         foreach (DataRow dr in drs){
  11.             string classid = dr["Cc_ID"].ToString();
  12.             string classname = dr["Cc_Name"].ToString();
  13.             //顶级分类显示形式
  14.             classname = "╋" + classname;
  15.  
  16.             ddlClass.Items.Add(new ListItem(classname, classid));
  17.             int sonparentid = int.Parse(classid);
  18.             string blank = "├";
  19.             //递归子分类方法
  20.             BindNode(ddlClass, sonparentid, dt, blank);
  21.         }
  22.         editparentid.DataBind();
  23.     }
  24.     /// <summary>
  25.     /// 创建树结点
  26.     /// </summary>
  27.     private void BindNode(DropDownList ddlNode, int parentid, DataTable dt, string blank)
  28.     { 
  29.         DataRow[] drs = dt.Select("ParentID= " + parentid);
  30.         foreach (DataRow dr in drs){
  31.             string classid = dr["Cc_ID"].ToString();
  32.             string classname = dr["Cc_Name"].ToString();
  33.             classname = blank + classname;
  34.             ddlNode.Items.Add(new ListItem(classname, classid));
  35.             int sonparentid = int.Parse(classid);
  36.             string blank2 = blank + "─";
  37.             BindNode(ddlNode,sonparentid, dt, blank2);
  38.         }
  39.     }

二次改造做成一个通用的类 调用  如:  new DrpGradingList("select * from dbo.NT_Clcs_ClientType ", "Cc_Name", "Cc_ID", defValue).BindDrpClass(ddl);

  1.  
  2.     /// <summary>
  3.     /// DropDownList 树形显示
  4.     /// </summary>
  5.     public class DrpGradingList
  6.     {
  7.         private string Sql = "";
  8.         private string Text = "";
  9.         private string Value = "";
  10.         private string defValue = "";
  11.         private string parentId = "ParentID";
  12.         /// <summary>
  13.         ///  DropDownList 树形显示
  14.         /// </summary>
  15.         /// <param name="sql">SQL语句</param>
  16.         /// <param name="text">显示的文本( 数据库字段)</param>
  17.         /// <param name="value">显示的文本对应的值( 数据库字段)</param>
  18.         public DrpGradingList(string sql, string text, string value, string defvalue)
  19.         {
  20.             this.Sql = sql;
  21.             this.Text = text;
  22.             this.Value = value;
  23.             this.defValue = defvalue;
  24.         }
  25.         /// <summary>
  26.         ///  DropDownList 树形显示
  27.         /// </summary>
  28.         /// <param name="sql">SQL语句</param>
  29.         /// <param name="text">显示的文本( 数据库字段)</param>
  30.         /// <param name="value">显示的文本对应的值( 数据库字段)</param>
  31.         public DrpGradingList(string sql, string text, string value, string defvalue,string pid)
  32.         {
  33.             this.Sql = sql;
  34.             this.Text = text;
  35.             this.Value = value;
  36.             this.defValue = defvalue;
  37.             this.parentId = pid;
  38.         }
  39.         /// <summary>
  40.         /// 创建树
  41.         /// </summary>
  42.         public void BindDrpClass(DropDownList ddlClass)
  43.         {
  44.             DataTable dt = DbHelper.ExecuteDataset(SysConst.DBNAME_XIAOWU, Sql).Tables[0];
  45.             ddlClass.Items.Clear();
  46.             ddlClass.Items.Add(new ListItem("顶级栏目", "0"));
  47.             DataRow[] drs = dt.Select(""+this.parentId+"= " + 0);
  48.             foreach (DataRow dr in drs)
  49.             {
  50.                 string classid = dr[this.Value].ToString();
  51.                 string classname = dr[this.Text].ToString();
  52.                 //顶级分类显示形式
  53.                 classname = "╋" + classname;
  54.  
  55.                 ListItem itme = new ListItem();
  56.                 itme.Text=classname;
  57.                 itme.Value=classid;
  58.                 if (itme.Value.Equals(this.defValue))
  59.                     itme.Selected = true;
  60.  
  61.                 ddlClass.Items.Add(itme);
  62.                 int sonparentid = int.Parse(classid);
  63.                 string blank = "├";
  64.                 //递归子分类方法
  65.                 BindNode(ddlClass, sonparentid, dt, blank);
  66.             }
  67.             ddlClass.SelectedIndex = ddlClass.Items.IndexOf(ddlClass.Items.FindByValue(this.defValue));
  68.             ddlClass.DataBind();
  69.         }
  70.         /// <summary>
  71.         /// 创建树  ddlClass.Items.Add(new ListItem("顶级栏目", "0"));
  72.         /// </summary>
  73.         public void BindDrpClass(DropDownList ddlClass, bool defItem)
  74.         {
  75.             DataTable dt = DbHelper.ExecuteDataset(SysConst.DBNAME_XIAOWU, Sql).Tables[0];
  76.             ddlClass.Items.Clear();
  77.             if (defItem){
  78.                 ddlClass.Items.Add(new ListItem("顶级栏目", "0"));
  79.             }
  80.             DataRow[] drs = dt.Select("" + this.parentId + "= " + 0);
  81.             foreach (DataRow dr in drs)
  82.             {
  83.                 string classid = dr[this.Value].ToString();
  84.                 string classname = dr[this.Text].ToString();
  85.                 //顶级分类显示形式
  86.                 classname = "╋" + classname;
  87.  
  88.                 ListItem itme = new ListItem();
  89.                 itme.Text = classname;
  90.                 itme.Value = classid;
  91.                 if (itme.Value.Equals(this.defValue))
  92.                     itme.Selected = true;
  93.  
  94.                 ddlClass.Items.Add(itme);
  95.                 int sonparentid = int.Parse(classid);
  96.                 string blank = "├";
  97.                 //递归子分类方法
  98.                 BindNode(ddlClass, sonparentid, dt, blank);
  99.             }
  100.             ddlClass.SelectedIndex = ddlClass.Items.IndexOf(ddlClass.Items.FindByValue(this.defValue));
  101.             ddlClass.DataBind();
  102.         }
  103.         public void BindDrpClass(DropDownList ddlClass, bool defItem,string parentIdefVale)
  104.         {
  105.             if (parentIdefVale.Length == 0) parentIdefVale = "0";
  106.             DataTable dt = DbHelper.ExecuteDataset(SysConst.DBNAME_XIAOWU, Sql).Tables[0];
  107.             ddlClass.Items.Clear();
  108.             if (defItem)
  109.             {
  110.                 ddlClass.Items.Add(new ListItem("顶级栏目", "0"));
  111.             }
  112.             DataRow[] drs = dt.Select("" + this.parentId + "= " + parentIdefVale);
  113.             foreach (DataRow dr in drs)
  114.             {
  115.                 string classid = dr[this.Value].ToString();
  116.                 string classname = dr[this.Text].ToString();
  117.                 //顶级分类显示形式
  118.                 classname = "╋" + classname;
  119.  
  120.                 ListItem itme = new ListItem();
  121.                 itme.Text = classname;
  122.                 itme.Value = classid;
  123.                 if (itme.Value.Equals(this.defValue))
  124.                     itme.Selected = true;
  125.  
  126.                 ddlClass.Items.Add(itme);
  127.                 int sonparentid = int.Parse(classid);
  128.                 string blank = "├";
  129.                 //递归子分类方法
  130.                 BindNode(ddlClass, sonparentid, dt, blank);
  131.             }
  132.             ddlClass.SelectedIndex = ddlClass.Items.IndexOf(ddlClass.Items.FindByValue(this.defValue));
  133.             ddlClass.DataBind();
  134.         }
  135.         /// <summary>
  136.         /// 创建树结点
  137.         /// </summary>
  138.         private void BindNode(DropDownList ddlNode, int parentid, DataTable dt, string blank)
  139.         {
  140.             DataRow[] drs = dt.Select(""+this.parentId+"= " + parentid);
  141.             foreach (DataRow dr in drs)
  142.             {
  143.                 string classid = dr[this.Value].ToString();
  144.                 string classname = dr[this.Text].ToString();
  145.                 classname = blank + classname;
  146.  
  147.                 ListItem itme = new ListItem();
  148.                 itme.Text = classname;
  149.                 itme.Value = classid;
  150.                 if (itme.Value.Equals(this.defValue))
  151.                     itme.Selected = true;
  152.                 ddlNode.Items.Add(itme);
  153.  
  154.                 int sonparentid = int.Parse(classid);
  155.                 string blank2 = blank + "─";
  156.                 BindNode(ddlNode, sonparentid, dt, blank2);
  157.             }
  158.         }
  159.     }

RadTreeView控件 应用:

  1. <telerik:RadTreeView runat="server" ID="RadTreeView2" Skin="Office2007"
  2.              Width="300px" Height="450px" CheckBoxes="True" DataTextField="ParentID" 
  3.                 TriStateCheckBoxes="False">
  4.             </telerik:RadTreeView>  
  1.  
  2.  AddTree("0", this.RadTreeView2.Nodes);
  3.  
  4.  public void AddTree(string fdm, RadTreeNodeCollection nodes)
  5.     {
  6.         DataTable dt = DbHelper.ExecuteDataset(SysConst.DBNAME_XIAOWU, "select * from NT_Clcs_Village where ParentID=" + fdm + "").Tables[0];
  7.  
  8.         foreach (DataRow dr in dt.Rows)
  9.         {
  10.             string classid = dr["Cv_ID"].ToString();
  11.             string classname = dr["Cv_Name"].ToString();
  12.  
  13.             RadTreeNode main = new RadTreeNode();
  14.             main.Text = classname;
  15.             main.Value = classid;
  16.             nodes.Add(main);
  17.             AddTree(classid, main.Nodes);
  18.         }
  19.    } 

其它:

dropDownList.SelectedIndex=dropDownList.Items.IndexOf(dropDownList.Items.FindByText(entityBase.Bugstatus));

MVC树形:

使用: @Html.DropDownList("ddlXzqy", ViewData["ddlXzqy"] as IEnumerable<SelectListItem>)

/// <summary>
       /// 创建树
       /// </summary>
       public void BindDrpClass(Guid selectId)
       {
           var list = repo.GetXzqyRootsList();
           List<SelectListItem> selitem = new List<SelectListItem>();
           foreach (var item in list)
           {
               //顶级分类显示形式
               if (selectId == item.ID)
               {
                   selitem.Add(new SelectListItem { Text = "╋" + item.Name, Value = item.ID.ToString(), Selected = true });
                   this.ViewData["selected"] = item.ID.ToString();
               }
               else
               {
                   selitem.Add(new SelectListItem { Text = "╋" + item.Name, Value = item.ID.ToString() });
               }
 
               //递归子分类方法
               string blank = "├";
               BindNode(item.ID, blank, selitem, selectId);
           }
           selitem.Insert(0, new SelectListItem { Text = "==行政区域==", Value = "-1" });
           ViewData["ddlXzqy"] = selitem;
       }
       private void BindNode(Guid parentid, string blank, List<SelectListItem> selitem, Guid selectId)
       {
           var list = repo.GetXzqyChildList(parentid);
           foreach (var item in list)
           {
               if (selectId == item.ID)
               {
                   selitem.Add(new SelectListItem { Text = blank + item.Name, Value = item.ID.ToString(), Selected = true });
                   this.ViewData["selected"] = item.ID.ToString();
               }
               else
               {
                   selitem.Add(new SelectListItem { Text = blank + item.Name, Value = item.ID.ToString() });
               }
               string blank2 = blank + "─";
               BindNode(item.ID, blank2, selitem, selectId);
           }
       }

  RecursionDemo.rar

转载笔记:DropDownList无限级分类(灵活控制显示形式)的更多相关文章

  1. C#无限级分类递归显示示例

    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="RoleDemo20150305 ...

  2. 2强类型DataSet (2011-12-30 23:16:59)转载▼ 标签: 杂谈 分类: Asp.Net练习笔记 http://blog.sina.com.cn/s/blog_9d90c4140101214w.html

    强类型DataSet (2011-12-30 23:16:59) 转载▼ 标签: 杂谈 分类: Asp.Net练习笔记 using System; using System.Collections.G ...

  3. 强类型DataSet (2011-12-30 23:16:59)转载▼ 标签: 杂谈 分类: Asp.Net练习笔记 http://blog.sina.com.cn/s/blog_9d90c4140101214w.html

    强类型DataSet (2011-12-30 23:16:59) 转载▼ 标签: 杂谈 分类: Asp.Net练习笔记 using System; using System.Collections.G ...

  4. MVC无限级分类02,增删改查

    继上一篇"MVC无限级分类01,分层架构,引入缓存,完成领域模型与视图模型的映射",本篇开始MVC无限级分类的增删改查部分,源码在github. 显示和查询 使用datagrid显 ...

  5. PHP递归实现无限级分类

    在一些复杂的系统中,要求对信息栏目进行无限级的分类,以增强系统的灵活性.那么PHP是如何实现无限级分类的呢?我们在本文中使用递归算法并结合mysql数据表实现无限级分类. 在一些复杂的系统中,要求对信 ...

  6. mysql无限级分类

    第一种方案: 使用递归算法,也是使用频率最多的,大部分开源程序也是这么处理,不过一般都只用到四级分类. 这种算法的数据库结构设计最为简单.category表中一个字段id,一个字段fid(父id).这 ...

  7. (实用篇)PHP递归实现无限级分类

    在一些复杂的系统中,要求对信息栏目进行无限级的分类,以增强系统的灵活性.那么PHP是如何实现无限级分类的呢?我们在本文中使用递归算法并结合mysql数据表实现无限级分类. 在一些复杂的系统中,要求对信 ...

  8. PHP无限级分类-递归(不推荐)

    [http://www.helloweba.com/view-blog-204.html] 在一些复杂的系统中,要求对信息栏目进行无限级的分类,以增强系统的灵活性.那么PHP是如何实现无限级分类的呢? ...

  9. STM32学习笔记(四)——串口控制LED(中断方式)

    目录: 一.时钟使能,包括GPIO的时钟和串口的时钟使能 二.设置引脚复用映射 三.GPIO的初始化配置,注意要设置为复用模式 四.串口参数初始化配置 五.中断分组和中断优先级配置 六.设置串口中断类 ...

随机推荐

  1. C#设计模式 —— 工厂模式

    . 工厂模式同样是项目中最常用的设计模式,工厂模式中又分为简单工厂,工厂方法,抽象工厂.下面我们由简单的开始逐一介绍. 1.简单工厂模式 简单工厂又被称为静态工厂,在设计模式中属于创建型模式.主要解决 ...

  2. No active profile set, falling back to default profiles: default

    No active profile set, falling back to default profiles: default 这个错误是由于idea没有设置默认启动环境,设置即可

  3. 安装Maven后使用cmd 执行 mvn -version命令 报错JAVA_HOME should point to a JDK not a JRE

    1. 可以执行maven指令,说明maven的配置没错 2. 打开cmd,在cmd输入: set JAVA_HOME=D:\Program Files\Java\jdk1.8.0_91 3. 再测试是 ...

  4. Altium Designer (DXP) 复制粘贴,放器件 出错报异常的原因

    安装好Altium Designer (DXP) 09板和2013后,运行后原理图复制粘贴元件或者放心的器件后出现下面异常, 原因是: 1.未启动 Print Spooler服务 2.没有安装任何打印 ...

  5. Home Assistant系列 -- 设置界面语言与地理位置

    Home Assistant 安装的时候会自动根据你的系统语言设置默认语言,安装完成以后也可以根据需要自己设置选择语言.启动 Home Assistant ,浏览器打开web 界面,点击左上角的用户图 ...

  6. 网站sql注入漏洞修复方案之metinfo 6.1.0系列

    近日,我们SINE安全对metinfo进行网站安全检测发现,metinfo米拓建站系统存在高危的sql注入漏洞,攻击者可以利用该漏洞对网站的代码进行sql注入攻击,伪造恶意的sql非法语句,对网站的数 ...

  7. Mac使用bootcamp安装win系统花屏解决方法

    15年11'乞丐版air装win屏幕花屏,很郁闷,先后找了网上很多方法,最终总结出了一个比较折中的方法,不玩游戏不使用大型3D的可以参考. 1 花屏现象 2 解决方法 2.1 禁用驱动 2.2 使用M ...

  8. Python学习笔记——常用的内置函数

    一.yield def EricReadlines(): seek = 0 while True: with open('D:/temp.txt','r') as f: f.seek(seek) da ...

  9. 基于 OpenResty 实现一个 WS 聊天室

    基于 OpenResty 实现一个 WS 聊天室 WebSocket WebSocket 协议分析 WebSocket 协议解决了浏览器和服务器之间的全双工通信问题.在WebSocket出现之前,浏览 ...

  10. WPF自定义命令

    WPF的自定义命令实现过程包括三个部分,定义命令.定义命令源.命令调用,代码实现如下: public partial class MainWindow : Window { public MainWi ...