下拉框怎样绑定树形结构数据呢?表数据:id      name   parentid
---------------------
-1 中国 0
-2 北京 -1
-3 广东 -1
-4 美国 0
-5 潮州 -3
-6 汕头 -3
-7 夏威夷 -4想要实现这样的效果:
中国
  北京
  广东
    潮州
    汕头
美国
  夏威夷请各位高手相助!

解决方案 »

  1.   

    绑定树形结构的下拉框     
    1.函数
    #Region "下拉框树形绑定"
        Private Function DDLBind(ByVal ddl As DropDownList, ByVal dt As DataTable)
            Dim fatherid As String
            If dt.Rows.Count = 0 Then Exit Function
            Dim i As Integer = dt.Rows.Count - 1
            Me.TextBox1.Text = Me.TextBox1.Text + 1
            Dim n As Integer = Me.TextBox1.Text
            Dim j As Integer
            While i + 1 > 0
                If IsDBNull(dt.Rows(i).Item("DC_PARENT_ID")) Then
                    fatherid = ""
                Else
                    fatherid = dt.Rows(i).Item("DC_PARENT_ID")
                End If            Dim strPading As String = ""            If ddl.Items(n).Value = fatherid Then
                    For j = 0 To n
                        strPading += " "
                    Next                Dim rslist As New ListItem
                    rslist.Text = strPading & "├" & dt.Rows(i).Item("DC_NAME")
                    rslist.Value = dt.Rows(i).Item("DC_ID")
                    ddl.Items.Add(rslist)                dt.Rows(i).Delete()
                    dt.AcceptChanges()                DDLBind(ddl, dt)                i = dt.Rows.Count
                End If
                i = i - 1
            End While
        End Function
    #End Region
    2.应用
    1)在页面放置一textbox控件,id=”textbox1”,text=-1
    2)直接调用函数随便C#的,但很简单,自己搞一下吧~~~
      

  2.   

    一下代码为Oracle数据库
    1.首先建立一个函数
    CREATE OR REPLACE FUNCTION FC_GET_BLANK(CURRENT_ID IN NUMBER) RETURN VARCHAR2 IS
      V_RETURN_BLANK VARCHAR2(20);
      V_PARENT_ID    NUMBER;
    BEGIN
      SELECT PARENTID INTO V_PARENT_ID FROM TBL WHERE ID = CURRENT_ID;
      WHILE V_PARENT_ID != 0 LOOP
        V_RETURN_BLANK := ' ' || V_RETURN_BLANK;
        SELECT PARENTID INTO V_PARENT_ID FROM TBL WHERE ID = V_PARENT_ID;
      END LOOP;  RETURN V_RETURN_BLANK;
    END FC_GET_BLANK;
    2.SQL语句
    SELECT ID, FC_GET_BLANK(ID) || NAME AS NAME, PARENTID FROM TBL
      

  3.   

    我看了看,其实不需要上面的函数都可以,自己在程序里面控制更方便
    用SQL语句很难整理出你需要的顺序在程序里面使用 DataTable.Select('PARENTID=' + ID) 来递归实现应该更容易
      

  4.   

    1、SQL语句
    SELECT ID, NAME, PARENTID FROM TBL
    2、C#代码
    private void BindDropDownList()
            {
                DataTable dtSite;            /* Get data here
                 * dtSite = ...
                 * */            DataRow[] dr = dtSite.Select("PARENTID=0");
                for (int i=0; i<dr.Length; i++)
                {
                    //ddlSite is your DropDownList control
                    ddlSite.Items.Add(new ListItem(dr["NAME"].ToString(), dr["ID"].ToString()));                this.BindData(ddlSite, dtSite, dr["PARENTID"].ToString());
                }
            }        private void BindData(DropDownList ddlSite, DataTable dt, string parentID)
            {
                DataRow[] dr = dtSite.Select("PARENTID=" + parentID.ToString());
                for (int i=0; i<dr.Length; i++)
                {
                    DropDownList ddlSite = new DropDownList();
                    //ddlSite is your DropDownList control
                    ddlSite.Items.Add(new ListItem(dr["NAME"].ToString(), dr["ID"].ToString()));                this.BindData(ddlSite, dtSite, dr["PARENTID"].ToString());
                }
            }
      

  5.   

    忘记加空格了private void BindDropDownList()
    {
        DataTable dtSite;    /* Get data here
            * dtSite = ...
            * */    DataRow[] dr = dtSite.Select("PARENTID=0");
        for (int i=0; i<dr.Length; i++)
        {
            //ddlSite is your DropDownList control
            ddlSite.Items.Add(new ListItem(dr["NAME"].ToString(), dr["ID"].ToString()));        this.BindData(ddlSite, dtSite, dr["PARENTID"].ToString(), " ");
        }
    }private void BindData(DropDownList ddlSite, DataTable dt, string parentID, string blank)
    {
        DataRow[] dr = dtSite.Select("PARENTID=" + parentID.ToString());
        for (int i=0; i<dr.Length; i++)
        {
            DropDownList ddlSite = new DropDownList();
            //ddlSite is your DropDownList control
            ddlSite.Items.Add(new ListItem(dr["NAME"].ToString(), dr["ID"].ToString()));        this.BindData(ddlSite, dtSite, dr["PARENTID"].ToString(), blank + " ");
        }
    }
      

  6.   

    Sorry, I didn't test it myself, please try the bellow code again...private void BindDropDownList()
    {
        DataTable dtSite;    /* Get data here
            * dtSite = ...
            * */    DataRow[] dr = dtSite.Select("PARENTID=0");
        for (int i=0; i<dr.Length; i++)
        {
            //ddlSite is your DropDownList control
            ddlSite.Items.Add(new ListItem(dr["NAME"].ToString(), dr["ID"].ToString()));        this.BindData(ddlSite, dtSite, dr["PARENTID"].ToString(), " ");
        }
    }private void BindData(DropDownList ddlSite, DataTable dt, string parentID, string blank)
    {
        DataRow[] dr = dtSite.Select("PARENTID=" + parentID.ToString());
        for (int i=0; i<dr.Length; i++)
        {
            DropDownList ddlSite = new DropDownList();
            //ddlSite is your DropDownList control
            ddlSite.Items.Add(new ListItem(blank + dr["NAME"].ToString(), dr["ID"].ToString()));        this.BindData(ddlSite, dtSite, dr["PARENTID"].ToString(), blank + " ");
        }
    }
      

  7.   

                DataTable dtData = Pagina.DataBind(0);            DataTable dtResult = dtData.Clone();
                dtResult = GetDropItems(dtData, dtResult, strParentID,"");         private DataTable GetDropItems(DataTable dt,DataTable dtResult, string strParentID,string addStr)
            {
                string strFilter = null;            if (strParentID != null && strParentID.Length > 0)
                    strFilter = "parent_id = '{0}'";
                else
                    strFilter = "parent_id is null or parent_id = ''";
                strFilter = string.Format(strFilter,strParentID);            DataRow[] drs = dt.Select(strFilter);
                foreach (DataRow dr in drs)
                {
                    DataRow drNew = dtResult.NewRow();
                    for (int i = 0; i < dr.Table.Columns.Count; i++)
                    {
                        drNew[i] = dr[i];
                    }
                    drNew["Name"] = addStr + drNew["Name"];
                    dtResult.Rows.Add(drNew);
                    GetDropItems(dt, dtResult, dr["id"].ToString(),addStr + " ");
                }            return dtResult;
            }