可能大家都知道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来实现了。
新闻热点
疑难解答