数据库结构: 
classidid 主键 
jobClassName 对应的类型名称 
ClassName 对应的父类的id 
通常做法: 
复制代码 代码如下:
 
private void Display(string parentid, String space) 
{ 
DataTable dt; 
String strSQL; 
strSQL = "Select * From Tree Where ParentID =" + parentid + " Order By ClassID DESC"; 
SqlDataAdapter sda = new SqlDataAdapter(strSQL, conn); 
DataSet ds = new DataSet(); 
sda.Fill(ds, "Tree"); 
dt = ds.Tables["Tree"]; 
if (dt.Rows.Count > 0) 
{ 
foreach (DataRow dr in dt.Rows) 
{ 
strOpinion += space + "<font color=red>[" + dr["JobClassName"].ToString() +"<br>"; 
Display(dr["ClassID"].ToString(), "            " + space,false); 
} 
} 
} 
 
很明显,这种做法是每个父分类都得建立一次连接,完全浪费资源 
现在一次取出所有分类,使用DataView的RowFilter属性做多次过滤 
关键代码 
复制代码 代码如下:
 
public partial class tree_Default : System.Web.UI.Page 
{ 
DataTable dt = null; 
protected void Page_Load(object sender, EventArgs e) 
{ 
if (!IsPostBack) 
{ 
bind(0); 
} 
} 
public void bind(int pid) 
{ 
DataTable dt1 = bindTree(pid); 
foreach (DataRow dr in dt1.Rows) 
{ 
int id = Convert.ToInt32(dr["classid"].ToString()); 
if (pid == 0) 
Response.Write("<div><h3>" + dr["jobclassname"].ToString() + "</h3></div>"); 
else 
Response.Write("<div>"+dr["jobclassname"].ToString()+"</div>"); 
bind(id); 
} 
} 
public DataTable bindTree(int pid) 
{ 
if (dt == null) 
dt = new data().getCatelogs(); 
DataView root = dt.DefaultView; 
root.RowFilter = "Parentid=" + pid; 
return root.ToTable(); 
} 
} 
 
这样的话,也就没必要浪费资源的了。 
其实这篇文章有些牵强了,一般分类都很少做改动的,直接用缓存或静态化处理就可以了,只是想到了记录一下O(∩_∩)O~。