【接上期】
目录
上期文章实现了支持模糊查询对关键字查询,本期计划实现“筛选”功能。
对于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就可以实现在内存中筛选了。
如果数据量、并发量不大还好,否则每次都访问数据库,会带来很大的性能下降。因此建议大家还是采用真正的“筛选”比较理想。
文章结束。创作图文不易,感谢点赞支持,欢迎收藏、关注我后期文章。