asp.net 데이터뷰 무한정 분류

2210 단어
데이터베이스 구조:
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 + "[" + dr["JobClassName"].ToString() +"
";
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("

" + dr["jobclassname"].ToString() + "

");
else
Response.Write("
"+dr["jobclassname"].ToString()+"
");
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~를 기록할 생각만 할 뿐이다.

좋은 웹페이지 즐겨찾기