当前位置:编程学习 > C#/ASP.NET >>

如何在下拉列表框里实再树形结构

如何在下拉列表框里实再树形结构 .谢谢.

写的详细一点.最好有源码.我的邮箱是tenghui157@163.com
如果写到这里不方便的话.发到我的邮箱里.非常感谢 --------------------编程问答-------------------- 我也想知道 --------------------编程问答-------------------- 看看吧

private void Page_Load(object sender, System.EventArgs e)
{
// 在此处放置用户代码以初始化页面
if(!Page.IsPostBack)
{
SqlConnection conn=new SqlConnection(ConfigurationSettings.AppSettings["conn"]);
SqlDataAdapter da=new SqlDataAdapter("select * from TreeView",conn);
DataSet ds=new DataSet();
da.Fill(ds);
bindDDL(ddl,ds,0,"");
}
}
private void bindDDL(DropDownList DDL,DataSet ds,int ParentID,string Tab)
{
DataView dv=new DataView(ds.Tables[0]);
dv.RowFilter="ParentMenu="+ParentID.ToString();
int count=0;
foreach(DataRowView Row in dv) 
{
count++;
if(Tab.IndexOf("├")>-1)
{
Tab=Tab.Replace("├","│");
}
if(Tab.IndexOf("└")>-1)
{
Tab=Tab.Replace("└","");
}
if(dv.Count==count)
{
Tab =Tab+"└";
}
else 
{
Tab =Tab+"├";
}
DDL.Items.Add(new ListItem(Tab+Row["MenuName"].ToString(),Row["MenuID"].ToString()));
bindDDL(ddl,ds,int.Parse(Row["MenuID"].ToString()),Tab);
Tab= Tab.Remove(Tab.Length-1,1);
}

}
--------------------编程问答-------------------- http://www.cnmaster.net/news/show.aspx?id=48&cid=25 --------------------编程问答-------------------- 这种都是用层来实现的,做web 开发的最好还是熟悉一下html和css 以及javascript, 这些是很重要的基础知识 --------------------编程问答-------------------- 标记一下,将来说不定要用到. --------------------编程问答-------------------- 你的这个写法生成后 如下代码,


                        <select name="ctl00$PageBody$kingDDLGroupID1$DropDownList1" id="ctl00_PageBody_kingDDLGroupID1_DropDownList1">
<option value="1">├ 环保科</option>
<option value="2">│ ├ 采油1矿</option>
<option value="6">│ │ ├ 采油1矿1队</option>
<option value="7">│ │ ├├ 采油1矿2队</option>
<option value="9">│ │ ├├├ 采油1矿4队</option>
<option value="8">│ │ ├├├└ 采油1矿3队</option>
<option value="3">│ ├├ 采油2矿</option>
<option value="10">│ ├│ ├ 采油2矿1队</option>
<option value="11">│ ├│ ├├ 采油2矿2队</option>
<option value="12">│ ├│ ├├├ 采油2矿3队</option>
<option value="13">│ ├│ ├├├└ 采油2矿4队</option>
<option value="4">│ ├├├ 采油3矿</option>
<option value="5">│ ├├├└ 采油4矿</option>
<option value="14">├├ 合同科</option>
<option value="15">├├└ 财务科</option>

</select>

每一层,只有第一个是对的,不知道如何修改!!呵呵请教!! --------------------编程问答-------------------- 代码如下:


        private   void   bindDDL(DropDownList  DDL,int  ParentID,string  Tab) 
        {
            int TotalRecord = 0;
            int intCount = 0;
            QueryParam qp = new QueryParam();
            qp.Where = "Where G_Delete=0 and G_ParentID =" + ParentID ;
            qp.Orderfld = "G_ShowOrder";
            qp.OrderType = 0;
            ArrayList lst = BusinessFacade.sys_GroupList(qp, out TotalRecord);

            foreach (sys_GroupTable Row in lst)
            {
                intCount++;
                if (Tab.IndexOf("├ ") > -1)
                {
                    Tab = Tab.Replace("├ ", "│ ");
                }
                if (Tab.IndexOf("└ ") > -1)
                {
                    Tab = Tab.Replace("└ ", " ");
                }
                if (lst.Count == intCount)
                {
                    Tab = Tab + "└ ";
                }
                else
                {
                    Tab = Tab + "├ ";
                }
                DDL.Items.Add(new ListItem(Tab + Row.G_CName, Row.GroupID.ToString()));
                if (intCount >1)
                {

                    Tab = Tab.Remove(Tab.Length - 1, 1);
                    bindDDL(DDL, Row.GroupID, Tab);
                }
                else
                {
                     bindDDL(DDL, Row.GroupID, Tab);
                   Tab = Tab.Remove(Tab.Length - 1, 1);
                }
            }
        } 
--------------------编程问答-------------------- 留着,说不定以后会用到
--------------------编程问答-------------------- 找到原因了,是因为tab连接的字符串后边有空格,哎耽误我一晚上功夫!!

新的代码如下!!

       private   void   bindDDL(DropDownList  DDL,int  ParentID,string  Tab) 
        {
            int TotalRecord = 0;
            int intCount = 0;
            QueryParam qp = new QueryParam();
            qp.Where = "Where G_Delete=0 and G_ParentID =" + ParentID ;
            qp.Orderfld = "G_ShowOrder";
            qp.OrderType = 0;
            ArrayList lst = BusinessFacade.sys_GroupList(qp, out TotalRecord);

            foreach (sys_GroupTable Row in lst)
            {
                intCount++;
                if (Tab.IndexOf("├") > -1)
                {
                    Tab = Tab.Replace("├", "│");
                }

                if (Tab.IndexOf("└") > -1)
                {
                    Tab = Tab.Replace("└", "");
                }

                if (lst.Count == intCount)
                {
                    Tab = Tab + "└";
                }
                else
                {
                    Tab = Tab + "├";
                }

                DDL.Items.Add(new ListItem(Tab + Row.G_CName, Row.GroupID.ToString()));
                bindDDL(DDL, Row.GroupID, Tab);
                Tab = Tab.Remove(Tab.Length - 1, 1);
            }
        } 




产生效果如下:

<select name="ctl00$PageBody$kingDDLGroupID1$DropDownList1" id="ctl00_PageBody_kingDDLGroupID1_DropDownList1">
<option value="1">├环保科</option>
<option value="2">│├采油1矿</option>
<option value="6">││├采油1矿1队</option>
<option value="7">││├采油1矿2队</option>
<option value="9">││├采油1矿4队</option>
<option value="8">││└采油1矿3队</option>
<option value="3">│├采油2矿</option>
<option value="10">││├采油2矿1队</option>
<option value="11">││├采油2矿2队</option>
<option value="12">││├采油2矿3队</option>
<option value="13">││└采油2矿4队</option>
<option value="4">│├采油3矿</option>
<option value="5">│└采油4矿</option>
<option value="14">├合同科</option>
<option value="15">└财务科</option>

</select>
基本实现了我的要求,
--------------------编程问答--------------------

   private void AddDataTree(int parentId, string increase, DataTable source)
    {
        increase = increase + "---";

        DataRow[] rowCollection = source.Select("父节点 = " + parentId);
        foreach (DataRow row in rowCollection)
        {
            string itemName = increase + "|" + row["绑定Value"].ToString();
            this.下拉控件.Items.Add(new ListItem(itemName, row["绑定Key"].ToString()));

            //递归加载
            if (source.Select("父节点 = " + Convert.ToInt32(row["当前节点"])).Length > 0)
            {
                AddDataTree(Convert.ToInt32(row["当前节点"]), increase, source);
            }
        }
    }

    public void Init_Control()
    {
        this.下拉控件.Items.Add(new ListItem("根节点", "0"));
        string strIncrease = "---";

        using (DataTable _table = 查出下拉控件所要绑定的所有数据)
        {
            foreach (DataRow row in _table.Rows)
            {
                this.下拉控件.Items.Add(new ListItem(strIncrease + "|" + row["绑定Value"].ToString(), row["绑定Key"].ToString()));
                AddDataTree(Convert.ToInt32(row["channel_id"]), strIncrease, _tableChannel);
            }
        }
    }


自己看咯 --------------------编程问答-------------------- 逻辑问题, 这和实现树没有什么区别。 。只是把节点改成字符串,放到DropDownList下面的item而已。 --------------------编程问答-------------------- 主调方法Init_Control()
数据形式给出来了
每个下拉项前面的符号只是个样子.
怎么配就看你个人喜好了. --------------------编程问答--------------------

///   <summary>      
///   绑定生成一个有树结构的下拉菜单      
///   </summary>      
///   <param   name="dtNodeSets">菜单记录数据所在的表</param>      
///   <param   name="strParentColumn">表中用于标记父记录的字段</param>      
///   <param   name="strRootValue">第一层记录的父记录值(通常设计为0或者-1或者Null)用来表示没有父记录</param>      
///   <param   name="strIndexColumn">索引字段,也就是放在DropDownList的Value里面的字段</param>      
///   <param   name="strTextColumn">显示文本字段,也就是放在DropDownList的Text里面的字段</param>      
///   <param   name="drpBind">需要绑定的DropDownList</param>      
///   <param   name="i">用来控制缩入量的值,请输入-1</param>      
private void MakeTree(DataTable dtNodeSets, string strParentColumn, string strRootValue, string strIndexColumn, string strTextColumn, DropDownList drpBind, int i)   
{   
    //每向下一层,多一个缩入单位      
    i++;   
  
    DataView dvNodeSets = new DataView(dtNodeSets);   
    dvNodeSets.RowFilter = strParentColumn + "=" + strRootValue;   
  
    string strPading = "";     //缩入字符     
  
    //通过i来控制缩入字符的长度,我这里设定的是一个全角的空格      
    for (int j = 0; j < i; j++)   
        strPading += " ";//如果要增加缩入的长度,改成两个全角的空格就可以了     
  
    foreach (DataRowView drv in dvNodeSets)   
    {   
        TreeNode tnNode = new TreeNode();   
        ListItem li = new ListItem(strPading + "├" + drv[strTextColumn].ToString(), drv[strIndexColumn].ToString());   
        drpBind.Items.Add(li);   
        MakeTree(dtNodeSets, strParentColumn, drv[strIndexColumn].ToString(), strIndexColumn, strTextColumn, drpBind, i);   
    }   
  
    //递归结束,要回到上一层,所以缩入量减少一个单位      
    i--;   
}   
--------------------编程问答-------------------- 递归循环, 一个一个加上去 --------------------编程问答-------------------- http://www.51ascx.com/50.html
扩展DropDownList支持分组功能
补充:.NET技术 ,  ASP.NET
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,