【接上期】
目录
上期文章实现了支持模糊查询对关键字查询,本期计划实现“筛选”功能。
对于GridView筛选功能的实现,有两种方式,一种是“拖拽控件”实现,一种是代码实现。今天我们重点说代码的实现,原生的方式仅做简单介绍。
			一、“拖拽控件”实现简述
		
这种方式一般需要现放置用于筛选的控件,可能是一个文本框加一个按钮,也可能是一个下拉菜单。然后进行数据源的配置,这里其实就是参数查询,参数来源于文本框或者下拉菜单。最后布置GridView控件,指定好数据源。


当事件触发后(按钮Click/下拉菜单TextChanged),直接执行数据绑定(GridView1.DataBind();)就行了。
看到这里,大家就明白了,这就是数据库的查询,说是“筛选”有些牵强。
			二、代码实现GridView筛选
		
这里我们按“职务”进行筛选,用下拉菜单来实现筛选关键字的选项。下拉菜单的数据来自GridView数据源中的“职务”列,我们按照不重复的职务选用。筛选用dataView的RowFilter命令实现。
			1.下拉菜单的数据源
		
在页面中拖入一个数据源,命名为SqlDataSource_ZW。注意选择“只返回唯一行”

配置好以后到源代码为:
SELECT distinct [zw] FROM [qxmm_demo] WHERE ([zw] IS NOT NULL)
		
代码解读
最后代码:

			2.添加下拉菜单及提示信息
		
继续我们之前的案例,这次在“信息栏”的表格不居中添加下拉菜单,ID:ddlZW
数据源指定为SqlDataSource_ZW
源代码:

页面效果:


需要注意的是,AutoPostBack 属性设置为true,否则无法触发“事件”。
			3.下拉菜单默认值改为“全部”
		
这是为了实现“筛选”后,用户不用筛选关键字时准备的
给下拉菜单添加事件:DataBound,也就是下拉菜单数据渲染结束后
		
			
			- 
				
				
					
					
						
					
				
				
					
					
						protected void ddlZW_DataBound(object sender, EventArgs e)
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						{
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						DropDownList dropDownList = sender as DropDownList;
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						// 添加一个新选项
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						dropDownList.Items.Insert(0, new ListItem("全部", "all"));
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						// 设置新添加的选项为默认值
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						dropDownList.SelectedIndex = 0;
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						}
					
				
			
 
		
		
代码解读
这样,下拉菜单就多了一个默认项目:全部
			4.编写代码
		
给下拉菜单加上选择更改的事件处理过称:
		
			
			- 
				
				
					
					
						
					
				
				
					
					
						protected void DropZW_TextChanged(object sender, EventArgs e)
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						{
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						//判断是全部还是部分筛选
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						if (this.ddlZW.SelectedValue != "all")
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						{
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						DataView dataView = null;
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						// 从SqlDataSource获取数据并转换为DataTable
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						DataTable dataTable = ((System.Data.DataView)SqlDataSource1.Select(DataSourceSelectArguments.Empty)).ToTable();
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						if (dataTable != null)
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						{
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						dataView = dataTable.DefaultView;
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						}
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						// 这里可以进行DataView的过滤操作
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						if (dataView != null)
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						{
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						//筛选条件
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						dataView.RowFilter = "zw LIKE '" + this.ddlZW.Text + "'";
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						//给GridView更换数据源
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						GridView1.DataSourceID = null;
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						GridView1.DataSource = dataView;
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						}
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						}
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						else
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						{
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						//如果是 全部 得吧数据源换回来
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						GridView1.DataSourceID = this.SqlDataSource1.ID;
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						}
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						//刷新控件
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						GridView1.DataBind();
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						//再次计算总记录数
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						GetRecordTotal();
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						//打开分页
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						this.GridView1.AllowPaging = true;
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						}
					
				
			
 
		
		
		
代码解读
			三、效果展示
		
			1.筛选结果小于1页
		

			2.筛选结果大于1页 
		

			3.选择全部(无筛选)效果
		

			四、讨论
		
严格来说,“查询”与“筛选”还是有区别的,“查询”一般是指从数据库中查询数据;“筛选”是指在从数据库获取的数据集合中进行的筛选。“查询”工作在数据库,“筛选”工作在内存。
本文涉及的两种实现的方式,第一种方式就是工作在数据库,第二种方式如果修改一下,令GridView的数据源从开始就使用DataView,这样利用DataView的RowFilter就可以实现在内存中筛选了。
如果数据量、并发量不大还好,否则每次都访问数据库,会带来很大的性能下降。因此建议大家还是采用真正的“筛选”比较理想。
文章结束。创作图文不易,感谢点赞支持,欢迎收藏、关注我后期文章。
