树形dropdownlist绑定N级例子

解决方案 »

  1.   

    这种方法绑定顶级和子级没问题,绑定pid不等于0的中间的就会出错
    if(dt.Rows.Count>0)
    {
    foreach(DataRow row in dt.Rows)
    {
    if(row["Pid"].ToString().Trim()=="0")//绑定根节点
    {
    this.DropDownList1.Items.Add(new ListItem(row["deptname"].ToString(),row["deptid"].ToString()));
    this.bindDropChildItem(this.DropDownList1,dt,row["deptid"].ToString(),1);
    }
    }
    }
    }

    void bindDropChildItem(DropDownList d,DataTable dt,string idstr,int length)
    {
    DataRow[] rows=dt.Select("Pid='"+idstr+"'","deptid DESC");//取出id子节点进行绑定
    for(int i=0;i<rows.Length;i++)
    {
    this.DropDownList1.Items.Add(new ListItem(this.SpaceLength(length)+rows[i]["deptname"].ToString(),rows[i]["deptid"].ToString()));
    this.bindDropChildItem(d,dt,rows[i]["deptid"].ToString(),length+1);//空白数目加1
    }
    }

    string SpaceLength(int i)
    {
    string space="";
    for(int j=0;j<i;j++)
    {
    space+=" ";//注意这里的空白是智能abc输入法状态下的v11字符;

    }
    return space;
    }
      

  2.   

    private void BindListBox()
    {
    DataTable dt = doBind.GetData(BLL_doClass.GetDataSet());
    LbClass.Items.Add(new ListItem("根目录","0"));
    Recursion(0,0,0,null,null,dt);
    LbClass.SelectedValue = Rtp.Text;}private void Recursion(int id,int pid,int level, string strName,string strRtp,DataTable dt)
    {
    DataRow[] drs = dt.Select("ID=" + id);
    string currentString =  GetDecorateString(level,strName);
    if (drs.Length != 0)
    {
    LbClass.Items.Add(new ListItem(currentString,strRtp));
    }
    drs = dt.Select("ParentID=" + id);if (drs.Length != 0)
    {
    level++;
    foreach (DataRow dr in drs)
    {
    Recursion((int)dr["ID"],(int)dr["PrefaceID"], level,dr["Name"].ToString(),dr["Rtp"].ToString(), dt);
    }
    }
    else
    {
    return; 
    }
    }
    private string GetDecorateString(int level, string strName)
    {
    string curentString = null;
    if (level != 1)
    {
    for(int i=1;i<level;i++)
    {
    curentString += "-";
    }
    curentString = "| "+curentString+strName;
    }
    else
    {
    curentString = strName;
    }return curentString;
    }
      

  3.   

    http://singlepine.cnblogs.com/archive/2006/03/19/353453.html
      

  4.   

    这段代码能解决,绑定
    id name pid
    1   11   0
    2    22  1
    3    33  2如果直接加绑ID=2,会不会出错