DataView类用来表示定制的DataTable的视图。
DataTable和DataView的关系是遵循著名的设计模式--文档/视图模式,其中DataTable是文档,而Dataview是视图。
DataView的Table属性指向相应的数据表,但DataTable并不保存过滤信息。既是对DataView改变之后,DataTable表并不会发生任何变化。
DataView一般通过DataTable.DefaultView 属性来建立,再通过RowFilter 属性RowStateFilter 属性建立这个DataTable的一个子集。
创建DataView
Method1:DataView同已经存在的、很可能是非空的DataTable对象连接
DataView dv;
dv = new DataView(theDataSet.Tables["Employees"]);
Method2:先创建一个新的视图,然后再用Table属性同表相关联
DataView dv = new DataView();
dv.Table = theDataSet.Tables["Employees"];
(DataView构造函数使你由DataTable中得到一个DataView对象。如果需要,反之亦可。事实上,DataTable对象的DefaultView属性返回一个该表的DataView对象。 )
DataView dv = dt.DefaultView;
设置过滤:
RowFilter是一个可读写的属性,用来读取和设置表过滤的表达式。
public virtual string RowFilter {get; set;}
你可以用列名,逻辑和数字运算符和常量的任意合法组合组成表达式。
dv.RowFilter = "Country = 'USA'";
dv.RowFilter = "EmployeeID >5 AND Birthdate < #1/31/82#"
dv.RowFilter = "Description LIKE '*product*'"
dv.RowFilter = "employeeID IN (2,4,5)"
(其中字符串必须以单引号括起,而日期型必须以#符号括起。字符型值可以使用小数点和科学计数法。)
要访问视图中某一行,可以使用DataRowView类。
总的来说,DataRow最多有四种状态:default,original,current和proposed。这些状态由DataRowVersion枚举类型设置,由RowVersion属性表达。
使用RowFilter过滤的示例:(下列代码在GridView的RowDataBound事件中)
DataRowView drV = e.Row.DataItem as DataRowView; //获取GridView当前行的视图
string strPartNumber = drV["strPartNumber"].ToString(); //获取drV行中的strPartNumber字段
DataView dv = dt_D.DefaultView; //dt_D为已经从数据库中抓取出来的表
dv.RowFilter = "strPartNumber='" + strPartNumber + "'";//设置过滤条件为dv视图中’strPartNumber‘列的值为从当前的GridView的行中获取的料号(strPartNumber)
StringBuilder strFilter = new StringBuilder(); //strFilter用于存放过滤后的dv视图的数据,并将其存放到指定的Table表格
strFilter.Append("<table id='table_info' cellpadding='3'>"); //id='table_info'定义了Table表格的样式,cellpadding='3'设置字符和边框的间距
strFilter.Append("");
foreach (DataRowView drv in dv) //遍历过滤后的dv视图的每一行
{
strFilter.Append("<tr><td>");
strFilter.Append(drv["strmono"].ToString()); //取得工单号(strmono)
strFilter.Append("</td><td>");
strFilter.Append((Convert.ToInt32( drv["nummoqty"])*Convert.ToInt32(drv["qty"])).ToString()); //取得该工单中此料号的总用量( nummoqty为工单数,qty为该料号在BOM中的用量)
strFilter.Append("</td></tr>");
}
strFilter.Append("</table>");
e.Row.Cells[5].Text = strFilter.ToString();//将得到的表格添加进GridView的指定单元格
要注意的是不能向GridView的单元格中动态添加控件,这样浏览器在刷新的时候会丢失控件内的数据如:
//Literal lit = new Literal();
//lit.Text = strFilter.ToString();
e.Row.Cells[5].Text = lit.ToString();
上面的写法是不合适的