利用ListControl控件来绑定分层次的数据

今天看到了一个帖子,想实现以下效果的下拉菜单

                                 显示文本             对应的values值 
                              ├一级目录1                   1               
                                    ├二级目录1             4   
                                    ├二级目录2             5         
                                    ├二级目录3             6   
                              ├一级目录2                   2   
                                    ├二级目录4             7   
                              ├一级目录3                   3   

表结构符合以下约束:

         id                       name                parentid  
        1                     一级目录1                 0   
        2                     一级目录2                 0   
        3                     一级目录3                 0   
        4                     二级目录1                 1   
        5                     二级目录2                 1   
        6                     二级目录3                 1   
        7                     二级目录4                 2   

 

那么根据实现的目的,做以下判断

1、应该支持无限级的深度

2、对所有符合此条件和显示需求的ListControl都要适合

3、适应各种不同数据格式的起始点(根节点)的逻辑条件 注:有的是0 有的是"" 有的是null等等。

所以归纳了3个方法,如下:

    ///  <summary>
    /// 用户构造具有递归层次的List控件
    ///  </summary>
    ///  <param name="listControl">要绑定数据的List控件 </param>
    ///  <param name="tblData">数据源 必须具备递归条件 </param>
    ///  <param name="strTextField">文本字段 </param>
    ///  <param name="strValueField">值字段 </param>
    ///  <param name="strPIDField">递归的父数据字段 </param>
    ///  <param name="strChildField">递归的子数据字段 </param>
    ///  <param name="strStartStatment">递归条件 </param>
    public void BuildTreeList(ListControl listControl,
        DataTable tblData,
        string strTextField,
        string strValueField,
        string strPIDField,
        string strChildField,
        string strStartStatment)
    {
        foreach (DataRow dr in tblData.Select(strStartStatment))
        {
            //先添加本项,然后添加子项
            ListItem liParent = new ListItem();
            liParent.Text = GetHeaderTextInListControlItemText(0) + dr[strTextField].ToString();
            liParent.Value = dr[strValueField].ToString();
            listControl.Items.Add(liParent);
            BuildListItem(listControl, dr, 0, tblData, strTextField, strValueField, strPIDField, strChildField);
        }
    }

    ///  <summary>
    /// 递归添加子项
    ///  </summary>
    ///  <param name="listControl">List控件 </param>
    ///  <param name="dr">一行 </param>
    ///  <param name="iDepth">深度,用户控制前面显示的空格 </param>
    ///  <param name="tblData">数据表格 </param>
    ///  <param name="strTextField">文本字段 </param>
    ///  <param name="strValueField">值字段 </param>
    ///  <param name="strPIDField">父字段 </param>
    ///  <param name="strChildField">子字段 </param>
    private void BuildListItem(ListControl listControl,
        DataRow dr,
        int iDepth,
        DataTable tblData,
        string strTextField,
        string strValueField,
        string strPIDField,
        string strChildField)
    {
        int iTempDepth = iDepth;
        iTempDepth++;
        string strFindChildRowStatment = strPIDField + "='" + dr[strChildField].ToString().Trim() + "'";
        DataRow[] drc = tblData.Select(strFindChildRowStatment);
        foreach (DataRow drChild in drc)
        {
            ListItem li = new ListItem();
            li.Value = drChild[strValueField].ToString();
            li.Text = GetHeaderTextInListControlItemText(iTempDepth) + drChild[strTextField].ToString();
            listControl.Items.Add(li);
            strFindChildRowStatment = strPIDField + "='" + drChild[strChildField].ToString() + "'";
            BuildListItem(listControl, drChild, iTempDepth, tblData, strTextField, strValueField, strPIDField, strChildField);
        }
    }

    ///  <summary>
    /// 通过深度来 确定显示文字的格式
    ///  </summary>
    ///  <param name="iDepth"> </param>
    ///  <returns> </returns>
    protected string GetHeaderTextInListControlItemText(int iDepth)
    {

        string strHeaderText = "";
        for (int i = 0; i  < iDepth; i++)
        {
            strHeaderText += Server.HtmlDecode("&nbsp;");
        }
        if (iDepth != -1)
        {
            strHeaderText += " ¦-";
        }
        return strHeaderText;
    }

在调用的时候,非常简单,如下:

DataTable dt = //获得你那个表;

BuildTreeList(yourControlName,dt,TextFiled,ValueFiled,IDFiled,PIDFiled," where PID ='0'");

呵呵具体的自己要根据参数整理……

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值