今天想在一个DropDownList中显示出部门的分级结构,在网上找了一段时间,没找到实现的源码,于是自已尝试着写了一个。
实现的效果:
数据库结构如下所示:
Depart_Up表示的是上级单位的ID号。如果没有父目录则Depart_Up为0,程序用递归来实现:
protected void RrecursionFindDepart(string id)
{
recursion=recursion+1; //嵌套一层则加一
string restr="├";
for(int j=0;j<recursion;j++)
{
restr=restr+" ┄";
}
DDepartment ddepart = new DDepartment();
DataTable dt = ddepart.ReturnChildTable(id);
for(int i=0;i<dt.Rows.Count;i++)
{
ListItem list = new ListItem(restr+dt.Rows[i]["Depart_Name"].ToString(),dt.Rows[i]["Depart_Id"].ToString());
dDepart_Up.Items.Add(list); //为DropDownList添加记录
RrecursionFindDepart(dt.Rows[i]["Depart_Id"].ToString()); //递归调用
}
recursion=recursion-1; //退出嵌套则减1
}
{
recursion=recursion+1; //嵌套一层则加一
string restr="├";
for(int j=0;j<recursion;j++)
{
restr=restr+" ┄";
}
DDepartment ddepart = new DDepartment();
DataTable dt = ddepart.ReturnChildTable(id);
for(int i=0;i<dt.Rows.Count;i++)
{
ListItem list = new ListItem(restr+dt.Rows[i]["Depart_Name"].ToString(),dt.Rows[i]["Depart_Id"].ToString());
dDepart_Up.Items.Add(list); //为DropDownList添加记录
RrecursionFindDepart(dt.Rows[i]["Depart_Id"].ToString()); //递归调用
}
recursion=recursion-1; //退出嵌套则减1
}
其中,ddepart.ReturnChildTable(id),是返回所有父目录为该ID的Department记录。ddepart是数据层的对象。代码如下:
public DataTable ReturnChildTable(string departId)
{
SqlConnection conn = new SqlConnection(ConfigurationSettings.AppSettings["ConnectionString"].ToString());
SqlDataAdapter ada = new SqlDataAdapter("OA_Depart_returnChildTable",conn);
ada.SelectCommand.CommandType = CommandType.StoredProcedure;
//设置参数
SqlParameter param = new SqlParameter("@depart_Id",SqlDbType.Int);
param.Value=Convert.ToInt16(departId);
ada.SelectCommand.Parameters.Add(param);
DataTable dt = new DataTable();
try
{
ada.Fill(dt);
return dt;
}
catch
{
return null;
}
}
{
SqlConnection conn = new SqlConnection(ConfigurationSettings.AppSettings["ConnectionString"].ToString());
SqlDataAdapter ada = new SqlDataAdapter("OA_Depart_returnChildTable",conn);
ada.SelectCommand.CommandType = CommandType.StoredProcedure;
//设置参数
SqlParameter param = new SqlParameter("@depart_Id",SqlDbType.Int);
param.Value=Convert.ToInt16(departId);
ada.SelectCommand.Parameters.Add(param);
DataTable dt = new DataTable();
try
{
ada.Fill(dt);
return dt;
}
catch
{
return null;
}
}
这样,一个分级的DropDownList就实现了,代是,这个DropDownList的缺点也是很明显的,就是效率太低了。只适合部门比较少的单位,如果达几千个部门,那么就要换更好的实现方法。
不知道别的无限分级DropDownList是怎么实现的,望各位达人指点一二。