日期:2014-05-19  浏览次数:20359 次

.NET中无限级新闻分类的分类如何显示
分类显示结果如下:
分类1                         修改   删除
    子分类1                 修改   删除
    子分类2                 修改   删除
分类2                         修改   删除
    子分类1                 修改   删除
    子分类2                 修改   删除
.........

在不用treeview的控件下如何形成以上的布局,找了很多资料,没有结果,望贴代码.
开发环境vs2003+sql2000,用的是petshop3的架构,还有就是看了很多资料都用datatable,而petshop3中传到ui层的都用ilist结构,如何转换.

------解决方案--------------------
/// <summary>
/// 得到所有类别,无限级,树形结构
/// </summary>
/// <param name= "tbs "> 树形结构数据源 </param>
/// <param name= "idFieldName "> 梆定列的Key </param>
/// <param name= "catFieldName "> 梆定列的Value </param>
/// <param name= "parentFieldName "> 数据源中表示父结点的字段名称 </param>
/// <returns> </returns>
public static DataTable GetTypeTree(DataTable tbs, string idFieldName, string catFieldName, string parentFieldName)
{
DataTable tb = new DataTable();
tb.Columns.Add(idFieldName, Type.GetType( "System.String "));
tb.Columns.Add(catFieldName, Type.GetType( "System.String "));

//Level,指定层级,加入新row时根据其上层row加一
tb.Columns.Add( "Level ", Type.GetType( "System.Int32 "));
DataRow row;

//先将顶级菜单放入tb
DataRow[] TopRows = tbs.Select(parentFieldName.ToString() + @ " = '0 ' ");
for (int i = 0; i < TopRows.Length; i++)
{
row = tb.NewRow();

row[0] = TopRows[i][idFieldName].ToString();
row[1] = TopRows[i][catFieldName].ToString();
row[2] = 0;//0为第一级

tb.Rows.Add(row);
}

DataRow[] rows;
for (int i = 0; i < tb.Rows.Count; i++)//tb.Rows.Count这个数字也是不断的在增大的,因为不断的插入新行
{
// tb进行循环
string strSpace = " ";
for (int j = 0; j < Convert.ToInt32(tb.Rows[i][2]); j++)
{
//循环嵌套对刚才的 这个循环什么作用?wjy905
strSpace += "   ";
}
rows = tbs.Select(parentFieldName + "= " + " ' " + tb.Rows[i][0].ToString() + " ' ");//父类名称为此行的id
for (int j = rows.Length - 1; j > = 0; j--) //倒循环,结果可以正序
{
//对刚才的嵌套循环
row = tb.NewRow();
row[0] = rows[j][idFieldName].ToString();
row[1] = strSpace + "-- " + rows[j][catFieldName].ToString();
row[2] = Convert.ToInt32(tb.Rows[i][2]) + 1;
tb.Rows.InsertAt(row, i + 1);
}
}
return tb;
}