///************************************************************************
/// Descript:
/// 根据指定分类ID,返回包含该ID在内的所有父级分类ID
/// Author:Blue.Dream
/// CreateDate:2004年9月6日, 8:55:32
/// ModifyDate:2004年10月6日, 16:12:28
///
///************************************************************************
/// <summary>
/// 根据ID的所有父级分类
/// </summary>
public class ExecuteClass
{
private DataTable SourceTable; //要分类的表
private DataTable ParentTable; //存放父级分类的表
private DataTable ObjectTable; //存放结果表
private int ID; //要处理的ID
private string ParentID; //父级分类字段名称
private string PriID; //主键标识ID
//初始化
public ExecuteClass(DataTable st,int id,string parentid,string priid)
{
SourceTable = new DataTable();
SourceTable = st.Copy();
ID = id;
ParentID = parentid;
PriID = priid;
ParentTable = new DataTable("Parent");
ParentTable = st.Clone();
ObjectTable = new DataTable("Object");
ObjectTable = st.Clone();
Execute();
}
public DataTable GetResult
{
get
{
return this.ObjectTable;
}
}
private void Execute()
{
InsertParent(ID);
ExecuteParent(ID);
int len = ParentTable.Rows.Count - 1;
for(int i = len; i >= 0; i--)
{
DataRow row = ObjectTable.NewRow();
for(int j = 0; j < ParentTable.Columns.Count; j++)
{
row[j] = ParentTable.Rows[i][j];
}
ObjectTable.Rows.Add(row);
}
}
//处理所有父级ID
private void ExecuteParent(int id)
{
DataView dv = SourceTable.DefaultView;
dv.RowFilter = PriID + " = " + id.ToString();
if(dv.Count > 0) //如果有此记录,则查看此记录的父级ID是否为0,如果不为0,则递归
{
int parID = Int32.Parse(dv[0][ParentID].ToString());
if(parID > 0) //如果有父级ID
{
//将此条信息加入父级分类临时表
InsertParent(parID);
//递归调用
ExecuteParent(parID);
}
}
}
//添加到父级临时表
//此处可以使用DataTalbe.Select()方法
private void InsertParent(int i)
{
foreach(DataRow row in SourceTable.Rows)
{
if(Int32.Parse(row[PriID].ToString()) == i)
{
DataRow r = ParentTable.NewRow();
for(int j = 0; j < SourceTable.Columns.Count; j++)
{
r[j] = row[j];
}
ParentTable.Rows.Add(r);
break;
}
}
}
}
说明:根据这个还可以返回树型表的所有一级分类及子分类列表,至于如何实现,我就不写了.
本文地址:http://com.8s8s.com/it/it43584.htm