根据指定ID,返回包含该ID的所有父级记录
2004-10-12 16:45
573 查看
///************************************************************************
/// 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://blog.csdn.net/Emoticons/shades_smile.gif)
/// 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://blog.csdn.net/Emoticons/shades_smile.gif)
![](http://blog.csdn.net/Emoticons/shades_smile.gif)
相关文章推荐
- sql如何根据父级Id得到所有下级的记录
- Oracle 复制指定Id下相关记录及其对应所有子表(包含子表的子表)下的记录
- Mysql 根据id查所有父级或子级
- 无限极分类mysql存储过程编写实现调用时给定一个id,返回其所有父级与子级并排序
- 找出所有符合条件的记录的指定字段并分组统计个数,返回指定格式。
- 找出所有符合条件的记录的指定字段并分组统计个数,返回指定格式。
- mysql 根据子级id查询其所有的父级的
- 传递一个父id返回所有子id的用法,可用于删除父级以下的所有子级
- 根据id查询出所有的父级和子级
- mysql sql 根据父级id查询书所有的子孙级数据,或根据子级id查询对应的父级
- MSSQL 返回指定表的最新一条记录的ID
- Oracle生成查询包含指定字段名对应的所有数据表记录语句
- unity3d 根据指定的Assets下的文件夹路径 返回这个路径下的所有文件名
- (java)获取某文件夹下面所有的指定类型的文件名称,并根据情况返回可用的名称
- 编写文件搜索小程序:1. 输入绝对路径以及搜索关键字,2. 搜索指定路径下(包括子文件夹)中名称包含关键字的所有文件并打印出,3. 将当前操作记录日志
- Oracle生成查询包含指定字段名对应的所有数据表记录语句
- 根据子级ID获取其所有父级
- unity3d 根据指定的Assets下的文件夹路径 返回这个路径下的所有文件名
- sql 递归函数,根据父级ID获取所有子级(含自己)
- Mysql 根据id查所有父级或子级