可能大家都知道dataview這個名詞的概念,但也許不是很多人可以說清楚在.net架構中它的應用范圍和程度。比如:究竟datagrid和repeater這些控件是如何和數據關聯起來的?很多人會告訴我是通過dataset。這顯然是正確的,但究竟最根本最直接的是通過什么聯系起來的呢?
答案就是dataview。其實下面的語句:
datagridtc.datasource = dtrst;
datagridtc.databind();
在工作的時候,它等效于:
datagridtc.datasource = ds.tables[0].defaultview;
datagridtc.databind();
dataset都是通過數據視圖將數據呈現在控件上面的。那如何才能做到物盡其用呢?如果通過靈活地使用dataview讓我們的程序更簡潔,性能更好呢?下面通過一個例子來說明:一段程序想實現將dataset已有的一個datatable重新排序。
某個寫法是:
dt = ds.tables[0].copy();
dt.clear();
int intnewid = 0;
for(int inti = 0;inti < ds.tables[0].rows.count;inti++)
{
dr = dt.newrow();
dr["datetype"] = ds.tables[0].rows[inti - 1 + 1]["datetype"].tostring();
dr["tcorder"] = ds.tables[0].rows[inti - 1 + 1]["tcorder"].tostring();
dr["timeclass_id"] = intnewid;
dr["timeclass_name"] = ds.tables[0].rows[inti - 1 + 1]["timeclass_name"].tostring();
dr["chn_namelocal"] = ds.tables[0].rows[inti - 1 + 1]["chn_namelocal"].tostring();
dr["user_name"] = ds.tables[0].rows[inti - 1 + 1]["user_name"].tostring();
dr["user_id"] = ds.tables[0].rows[inti - 1 + 1]["user_id"].tostring();
dt.rows.add(dr);
dt.acceptchanges();
intnewid++;
}
dtrst = dt.copy();
dtrst.clear();
foundrow = dt.select("1 = 1", "timeclass_name, datetype, tcorder");
for(int inti = 0;inti < foundrow.length;inti++)
{
dr = dtrst.newrow();
dr["datetype"] = foundrow[inti]["datetype"].tostring();
dr["tcorder"] = foundrow[inti]["tcorder"].tostring();
dr["timeclass_id"] = foundrow[inti]["timeclass_id"].tostring();
dr["timeclass_name"] = foundrow[inti]["timeclass_name"].tostring();
dr["chn_namelocal"] = foundrow[inti]["chn_namelocal"].tostring();
dr["user_name"] = foundrow[inti]["user_name"].tostring();
dr["user_id"] = foundrow[inti]["user_id"].tostring();
dtrst.rows.add(dr);
dtrst.acceptchanges();
}
datagridtc.datasource = dtrst;
datagridtc.databind();
另外一個寫法是:
dataview dv = ds.tables[0].defaultview;
dv.sort = "timeclass_name, datetype, tcorder";
datagridtc.datasource = dv;
datagridtc.databind();
顯然方法二從代碼上就簡潔多了,更重要的是它不要再新創建dataset等,減少了內存和cpu的消耗。
因此大家在遇到需要排序或者過濾數據的時候,要多想想可否使用dataview來實現了。
新聞熱點
疑難解答