在Visual Studio中使用LINQDataSource和DropDownList来过滤GridView显示的数据是一个常见的需求。本文将介绍如何通过Visual Studio的设计器模式来实现这一功能。将使用LINQ to SQL实体类,这些类包含在名为VehiclesData.dbml的.dbml文件中。车辆型号将显示在GridView中,并通过DropDownList按制造商进行过滤。
首先,向GridView添加一个LinqDataSource控件。展开GridView的“智能任务”,选择“新建数据源”。在数据类型中选择LINQ(在本例中将其命名为GridViewDataSource)。点击OK。配置GridViewDataSource以使用VehicleModels表。
展开GridView的“智能任务”,选择适当的DataContext(在例子中是VehiclesDataDataContext),点击Next。选择VehicleModel表。注意,要使GridView自动具有编辑、更新、删除功能,必须选择表中的所有字段。点击Finish。将设置GridView仅显示名称列,并允许排序和分页。
配置DropDownList以列出VehicleManufacturers表中的Manufacturer列:
添加另一个LinqDataSource(这里命名为DropDownDataSource)。展开DropDownDataSource的“智能任务”,选择“配置数据源”,选择VehiclesDataDataContext。现在选择VehicleManufacturers表,仅选择Manufacturer和ID列。需要Manufacturer列显示在列表中,ID列用于绑定。
配置DropDownList以显示Manufacturer列中的数据。打开DropDownList的“智能任务”,选择“选择数据源”。选择DropDownDataSource。对于数据字段(显示在列表中的字段),选择Manufacturer,对于数据值,需要ID。
设置GridViewDataSource的'Where'子句。打开GridViewDataSource的“智能任务”,选择“配置数据源”,点击Next,然后选择Where。VehicleManufacturerID是VehicleModels表中的外键,需要与VehicleManufacturer表中的ID列关联。
点击Add,然后点击OK。将DropDownList的AutoPostBack设置为true。到目前为止,已经实现了预期的功能,但GridView仅显示了DropDownList的过滤选择。
添加“显示全部”列表项:展开DropDownList的“智能任务”,选择“编辑项”。添加新项,命名为“显示全部”,对于值,输入-1。点击OK。将DropDownList的AppendDataBoundItems设置为true。
转到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子句。
C#代码如下:
where = "(VehicleManufacturerID == @VehicleManufacturerID) || (@VehicleManufacturerID == @ShowAll)"
借助额外的参数:
<asp:Parameter Name="ShowAll" Type="Int32" DefaultValue="-1" />