DataView 直译是 数据视图。由数据库表(Table)映射到DataTable不难联想到 数据库视图 映射到 DataView。
数据库中视图是一个虚表,数据库中存储的只是一句查询SQL语句,每次程序访问此视图时,原理类似于执行此SQL语句,生成一个临时表,然后程序再对此临时表操作,结果对实表一样有效。
视图通常只是为了简化程序的查询操作,允许在一个实表上建立多个视图
同样的,DataView表示用于排序、筛选、搜索、编辑和导航的 DataTable 的可绑定数据的自定义视图。
举一个简单例子来说明它的作用。
有时候你想把DataTable的一部分数据绑定到控件1,而把DataTable的全部数据绑定到控件2,那么利用DataView可以简单地实现。
下面来看看DataView 的每个功能实现。
1、排序
创建一个空页面Default.aspx,在页面中添加一个按钮和一个GridView控件
- <div>
- <asp:Button ID="Button1" runat="server" Text="按id排序" OnClick="Button1_Click" />
- <br />
- <asp:GridView ID="GridView1" runat="server">
- </asp:GridView>
- </div>
在后台代码中,我们手动创建一个DataTable数据源,以下的操作都基于此数据源。如下
- //创建数据源
- private DataTable CreateTable()
- {
- DataTable dt = new DataTable();
- dt.Columns.Add(new DataColumn("id", typeof(int)));
- dt.Columns.Add(new DataColumn("name", typeof(string)));
- int[] ids ={ 8, 5, 4, 3, 1, 9, 6, 7, 2 };
- DataRow dr;
- for (int i = 0; i < ids.Length; i++)
- {
- dr = dt.NewRow();
- dr[0] = ids[i];
- dr[1] = "not_" + ids[i].ToString();
- dt.Rows.Add(dr);
- }
- return dt;
- }
在Page_Load中添加如下代码,初使化页面
- protected void Page_Load(object sender, EventArgs e)
- {
- if (!IsPostBack)
- {
- if (ViewState["data"] == null)
- {
- ViewState["data"] = CreateTable();
- }
- this.GridView1.DataSource = ViewState["data"] as DataTable;
- this.GridView1.DataBind();
- }
- }
对Button1的Click事件实现对ID列的排序
- //排序
- protected void Button1_Click(object sender, EventArgs e)
- {
- DataView dv;
- if (ViewState["data"] != null)
- {
- dv = (ViewState["data"] as DataTable).DefaultView;
- }
- else
- {
- dv = CreateTable().DefaultView;
- }
- //字符串不区分大小写
- dv.Sort = "ID ASC";
- this.GridView1.DataSource = dv;
- this.GridView1.DataBind();
- }
页面运行的初始状态如下
单击按钮后如下
可见排序的重点只是对 DataView.Sort 属性进行赋值 dv.Sort = "ID ASC";
2、筛选
实现筛选主要是对DataView.RowFilter 属性操作。
最简单的比如
dv.RowFilter = "name > 'not_5'";
但DataView.RowFilter 支持更为复杂的表达式,如
dv.RowFilter = "id in (1,3,5,7)";
dv.RowFilter = "name like 'not_5*'";
更详细的可以参考 DataColumn.Expression 属性
http://msdn.microsoft.com/zh-cn/library/system.data.datacolumn.expression.aspx