参考自:http://www.cnblogs.com/Spirithero/archive/2011/07/20/2111351.html
重点在于DataView是DateTable相关联的一个视图而已,无论你如何使用RowFilter,DataView虽然被改变,但DateTable数据不会减少,所以你不要幻想连续使用多个RowFilter 来得到叠加过滤的效果,一个DataView只支持一个RowFilter,你只能使用 not ,and 来连接多个过滤条件。
DataTable dt = DataView.ToTable(); //获取过滤结果表格
DataTable dt = DataView.Table; //获取的是原来构造DataView的那个原表(没有过滤之前的那个表)。
但是可以通过保留上次查询过滤的结果表格,下次查询时,以保留的表格为查询对象,可以实现多次过滤查询。
控件截图:
全局变量:
DataTable pTable; //原始结果表格
DataTable multQueryTable; //多次查询结果表格
主要代码:
//查询
private void btnFilter_Click(object sender, EventArgs e)
{
string strField = comBField.Text.ToString(); //查询字段
string strSymbol = comBsymbol.SelectedItem.ToString(); //查询符号
string strTarget = textFind.Text; //查询对象
if (string.IsNullOrEmpty(strField) || string.IsNullOrEmpty(strTarget)||string.IsNullOrEmpty(strSymbol)) //判断查询语句是否满足条件
{
MessageBox.Show("查询内容不能为空!");
return;
}
DataTable sqlTable = pTable.Copy(); //原始结果表格复制给查询表格,以保留原始结果
DataView curDV;
if (checkMultQuery.Checked == true && multQueryTable !=null ) //判断是否多次查询
{
curDV = multQueryTable.DefaultView; //获取多次查询表格的视图
}
else
{
curDV = sqlTable.DefaultView; //获取原始表格的自定义视图
}
string strSQL; //查询语句
if (strSymbol == "LIKE") //模糊查询
{
strSQL = strField + " LIKE '%" + strTarget + "%'";
}
else
{
strSQL = strField + " " + strSymbol + " " + strTarget; //条件查询
}
curDV.RowFilter = strSQL; //筛选满足条件的行数据
dataGridView.DataSource = curDV; //绑定查询结果到数据视图
multQueryTable = curDV.ToTable(); //获取查询过滤结果的表格
}
重置,即显示原始表格:
//重置
private void btnReset_Click(object sender, EventArgs e)
{
if (pTable!= null) //如果原始表格非空
{
dataGridView.DataSource = pTable; //绑定原始结果表格
}
}