您的位置:首页 > 其它

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

2008-04-22 14:53 363 查看
今天看到了一个帖子,想实现以下效果的下拉菜单

显示文本 对应的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(" ");
}
if (iDepth != -1)
{
strHeaderText += " ¦-";
}
return strHeaderText;
}

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

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

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

呵呵具体的自己要根据参数整理……
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: