DefaultView 的作用

DataTable.DefaultView是DataTable的默认视图获取可能包含筛选(sort),过滤(FilterExpression)视图或者游标位置的自定义视图。

DefaultView[0] 这个0表示这个查询出来的视图中的第一行,如果DefaultView[1],那么这个是第二行 

比如:sda.SelectCommand = new SqlCommand("select dw from sldw", con);
sda.Fill(ds, "sldw");  //sldw 是表名
this.ddlsldw.DataSource = ds.Tables["sldw"].DefaultView;这样就是一个视图,

ds.Tables["sldw"].DefaultView[0]这样是结果集中的第一行,ds.Tables["sldw"].DefaultView[1]这样是结果集中的第二行。

一直以来在对数据进行排序, 条件查询都是直接重复构建SQL来进行, 在查询次数和数据量不多的情况下倒没觉得什么, 但慢慢得, 当程序需要对大量数据椐不同条件进行多次查询或排序时, 使用这种方式显然对程序的性能影响将会是十分明显的, 在网上找了一下, 发现DataView能很好的解决这个问题, 其提供了一种简单直观的方式来操作数据, 如下面代码:
SqlConnection conn = new SqlConnection("server=.;database=mydata;uid=sa;pwd=123456;");
conn.Open();
SqlDataAdapter adp = new SqlDataAdapter();
adp.SelectCommand = new SqlCommand("select * from goods",conn);
DataSet ds = new DataSet();
adp.Fill(ds, "goods");                                
Response.Write(ds.Tables[0].DefaultView.Count);      //显示当前查询结果的总行数
ds.Tables[0].DefaultView.Sort = "GoodsID Desc";     //这里设定筛选排序的字段及方式
ds.Tables[0].DefaultView.RowFilter = "Shopid = 1"; //设定过滤条件, 得到条件潢足为”ShopID =1 的所有数据” 

this.GridView1.DataSource = ds.Tables[0]; //绑定到gridview数据源
this.GridView1.DataBind();
其中如果我们需要变更查询结结果, 例如得到所有goodsID字段大于10的数据, 则只需改变上面代码中的
ds.Tables[0].DefaultView.RowFilter = "Shopid = 1";   
改为
ds.Tables[0].DefaultView.RowFilter = "goodsID > 10";    // 更改过滤条件RowFilter
取可, 而不需要同数据库服务器进行更多的交互操作, 从而一定程度上加快程序的执行, 而代码也简洁。

究竟DataGrid和 Repeater这些控件是如何和数据关联起来的?很多人会告诉我是通过DataSet。这显然是正确的,但究竟最根本最直接的是通过什么联系起来的呢? 答案是DataView

DataGridTC.DataSource = dtRst;
DataGridTC.DataBind();
在工作的时候,它等效于:
DataGridTC.DataSource = ds.Tables[0].DefaultView;
DataGridTC.DataBind();     

 DataSet都是通过数据视图将数据呈现在控件上面的。也就是说绑定控件与数据关联是DataView实现,我们DataTable.DataView称为了自定义视图。。

一段程序想实现将DataSet已有的一个DataTable重新排序:

dt = ds.Tables[0];

dtRst = dt.Copy();  //dt是原表,原表不满足要求,dtRet是需要重构的表

dtRst.Clear();       // 清除表所有数据,保留表结构,快速建表

 DataRow [] FoundRow = dt.Select("1 = 1", "TimeClass_Name, DateType, TCOrder"); 

 //   注意这里用到DataTable.Select(string FileExpression, string sort) 筛选表达式 和 排序字段,默认升序,返回DataRow对象数组
for(int intI = 0;intI < FoundRow.Length;intI++)
{
dr = dtRst.NewRow();    // 按dtRst结构新建DataRow
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来实现了。

在遵守某些限制的情况下,还可以通过数据视图更新、插入和删除记录:

数据视图必须包含有关每个记录的足够信息,提供足够的信息来唯一标识记录。这些信息可以包含一个主键或其他列的组合。对于每个操作,数据视图的 AllowEdit、AllowNew 和 AllowDelete 属性必须相应设置为true。

如: DataView1.Sort = "CustomerID";  
int foundIndex = dataView1.Find(textBox1.Text);         //
如果想要查找多个记录,则使用 FindRows 方法。
注:使用Find方法应先Sort,因为要指定你的查询条件是属于哪一列。

下面的示例展示如何向视图添加新记录,更新其中的三个字段:

DataRowView drv;
drv = dataView1.AddNew();
drv["CustomerID"] = "AAA";
drv["CompanyName"] = "AAFabrikam, Inc.";
drv["City"] = "Aurora";

具体的见 http://lthaoyue.blog.hexun.com/46908099_d.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值