一.创建如下数据库
string sql = "select * from speciality";
二.代码如下
public partial class _Default : System.Web.UI.Page
{
//把数据从oracle数据库里读入到:DataTable dt;
DataTable dt = DaoSpeciality.GetDataTable(sql);
//创建一个结构和 dt 一样的 DataTable;
DataTable newTable = new DataTable();
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
DataColumn dc = new DataColumn("speciality_id", Type.GetType("System.String"));
newTable.Columns.Add(dc);
DataColumn dc2 = new DataColumn("name", Type.GetType("System.String"));
newTable.Columns.Add(dc2);
int levels = 1;
FilterData("0", ref levels);
this.DropDownList1.DataSource = newTable;
DropDownList1.DataTextField = "name";
DropDownList1.DataValueField = "speciality_id";
this.DropDownList1.DataBind();
}
}
//递归,把过滤出来的数据添加到新建的 newTable 里。
private void FilterData(string speID, ref int levels)
{
string s = string.Empty;
for (int j = 1; j < levels; j++)
{
s = s + " ";
}
levels += 1;
int curlevels = levels;
DataRow[] dataRow = dt.Select("parent_id='" + speID + "'");
for (int i = 0; i < dataRow.Length; i++)
{
DataRow dr = newTable.NewRow();
dr["speciality_id"] = dataRow[i]["speciality_id"].ToString();
dr["name"] = s + dataRow[i]["name"].ToString();
newTable.Rows.Add(dr);
FilterData(dataRow[i]["speciality_id"].ToString(), ref levels);
levels = curlevels;
}
}
}
三.备注
也可以将(一)中的sql语句改为
string sql = @"select * from speciality
start with parent_id=0
connect by prior speciality_id = parent_id";
这样递归查出的结果集直接是树形结构了,我个人认为使FilterData()的遍历次数减少了。
四.效果如下