使用 LinqDataSource 和带有 LinqDataSource 的下拉列表添加“显示全部”选项到 GridView 数据过滤器
如何向 DropDownList 添加“显示全部”选项,该选项用作 GridView 的数据筛选器,且 LinqDataSource 上没有代码隐藏。
引言
这是一种非常快速的方法(有点像解决方法),通过 LinqDataSource
,使用 Visual Studio 设计器模式,在 GridView
的下拉列表筛选器中实现“显示全部”选项。
在此示例中,我们使用 LINQ to SQL 实体类(如下图所示),这些实体类包含在名为 *VehiclesData.dbml* 的 * .dbml* 文件中。 车辆模型将列在 GridView
中,并由其制造商通过下拉列表进行筛选。
设置 GridView
- 向
GridView
添加一个LinqDataSource
控件。 - 展开
GridView
的“智能任务”,然后选择 *新建数据源*。 - 对于数据类型,选择 *LINQ*(在此示例中,我们将其命名为
GridViewDataSource
)。 - 单击 *确定*。
- 配置
GridViewDataSource
以使用 VehicleModels 表。 - 展开
GridView
的“智能任务” - 选择适当的
DataContext
(在我们的例子中是VehiclesDataDataContext
),单击 *下一步*。 - 选择 VehicleModel 表。
- 单击“完成”。
注意:要在 GridView
中自动提供编辑、更新、删除功能,必须选择表中的所有字段。
我们将设置 GridView
仅显示 Name 列并允许排序和分页。
设置 DropDownList
- 配置
DropDownList
以列出 VehicleManufacturers 表中的 Manufacturer 列 - 添加另一个
LinqDataSource
(此处名称为DropDownDataSource
)。 - 展开 DropDownDataSource 的“智能任务”,选择 *配置数据源*,选择
VehiclesDataDataContext
。 - 现在选择 VehicleManufacturers 表,仅包含 Manufacturer 和 ID 列。 我们需要 Manufacturer 列来在列表中显示它,并且需要 ID 来将所有内容绑定在一起。
- 配置
DropDownList
以显示 Manufacturer 列中的数据。 - 打开
DropDownList
的“智能任务”,选择 *选择数据源*。 - 选择
DropDownDataSource
。 对于数据字段(在列表中显示),选择 Manufacturer,对于数据值,我们需要 ID。
设置 DropDownList 以筛选 GridView 中显示的数据
- 设置
GridViewDataSource
的“Where
”子句。 - 打开
GridViewDataSource
的“智能任务”,选择 *配置数据源*,单击 *下一步*,然后单击 *Where*。 - VehicleManufacturerID 是 VehicleModels 表中的外键,需要将其与 VehicleManufacturer 表中的 ID 列相关联。“操作方法”如下图所示
- 单击 *添加*。
- 单击 *确定*。
- 将 AutoPostBack="true" 设置为
DropDownList
。
到目前为止,我们已经使一切正常工作,但 GridView
仅显示 DropDownList
中筛选后的选择。
向 DropDownList 筛选器添加“显示全部”选项
- 添加“显示全部”列表项
- 展开
DropDownList
的“智能任务”,选择 *编辑项*。 - 添加新项,将其命名为“显示全部”,对于值,输入 -1。
- 单击 *确定*。
- 将
AppendDataBoundItems="true"
设置为DropDownList
。 - 转到
GridViewDataSource
源代码并进行如下所示的更改
<asp:linqdatasource id="GridViewDataSource" runat="server"
contexttypename="WebApplication1.VehiclesDataDataContext"
tablename="VehicleModels"
where="(VehicleManufacturerID ==
@VehicleManufacturerID) || (@VehicleManufacturerID == @ShowAll)">
<WhereParameters>
<asp:ControlParameter ControlID="ddManufacturers" Name="VehicleManufacturerID"
PropertyName="SelectedValue" Type="Int32" />
<asp:Parameter Name="ShowAll" Type="Int32" DefaultValue="-1"/>
</WhereParameters>
</asp:linqdatasource>
因此,发生的情况是我们添加了一个辅助参数来扩展 LINQ 查询的 Where
子句。
where="(VehicleManufacturerID
== @VehicleManufacturerID) || (@VehicleManufacturerID == @ShowAll)"
借助附加参数
<asp:Parameter Name="ShowAll" Type="Int32" DefaultValue="-1" />
但是请记住,它的值绝不能具有 @VehicleManufacturerID
或我们将其等于它的任何参数可能具有的值。