【问题标题】:Using filters with gridview and stored procedures in ASP.NET and C#在 ASP.NET 和 C# 中使用带有 gridview 和存储过程的过滤器
【发布时间】:2011-11-01 21:01:41
【问题描述】:

我有一个由存储过程填充的网格视图。在这个数据集上,用户应该能够通过从 2 个下拉列表中选择 LabID 和/或 SiteName 来过滤它。实现这一目标的最佳方法是什么?

    <asp:DropDownList ID="ddlLabIDs" runat="server" AutoPostBack="True" 
        DataSourceID="SqlDataSource2" DataTextField="LabID" 
        DataValueField="LabID" AppendDataBoundItems="True">
    </asp:DropDownList>
    <asp:SqlDataSource ID="SqlDataSource2" runat="server" 
        ConnectionString="<%$ ConnectionStrings:ConnectionString1 %>" 
        SelectCommand="exec usp_LabIDs_Select;"></asp:SqlDataSource>

    <asp:DropDownList ID="ddlSiteNames" runat="server" 
        DataSourceID="SqlDataSource3" DataTextField="SiteName" 
        DataValueField="SiteName" AppendDataBoundItems="True" 
        AutoPostBack="True">
    </asp:DropDownList>
    <asp:SqlDataSource ID="SqlDataSource3" runat="server" 
        ConnectionString="<%$ ConnectionStrings:ConnectionString1 %>" 
        SelectCommand="exec usp_SiteNames_Select;"></asp:SqlDataSource>

    <asp:GridView ID="AllDataFlat" runat="server" AllowPaging="True" PageSize="20"
        AllowSorting="True" AutoGenerateColumns="False" 
        DataSourceID="SqlDataSource1">
        <Columns>
            <asp:BoundField DataField="LabID" HeaderText="LabID" SortExpression="LabID" />
            <asp:BoundField DataField="SiteName" HeaderText="SiteName" 
                SortExpression="SiteName" />
            <asp:BoundField DataField="StartDateTime" HeaderText="StartDateTime" 
                SortExpression="StartDateTime" />
            <asp:BoundField DataField="FilterNumber" HeaderText="FilterNumber" 
                SortExpression="FilterNumber" />
            <asp:BoundField DataField="AmtWaterFiltered" HeaderText="AmtWaterFiltered" 
                ReadOnly="True" SortExpression="AmtWaterFiltered" />
            <asp:BoundField DataField="WaterTemp" HeaderText="WaterTemp" ReadOnly="True" 
                SortExpression="WaterTemp" />
            <asp:BoundField DataField="pH" HeaderText="pH" SortExpression="pH" />                
        </Columns>           
    </asp:GridView>        

    <asp:SqlDataSource ID="SqlDataSource1" runat="server" 
        ConnectionString="<%$ ConnectionStrings:ConnectionString1 %>" 
        SelectCommand="exec usp_AllDataFlat_Select;">
    </asp:SqlDataSource>

谢谢。

【问题讨论】:

  • 对不起,如果我不清楚,你想要什么.....?????
  • 我希望能够使用 LabID 和 SiteName 下拉列表过滤数据网格。

标签: c# asp.net stored-procedures gridview filter


【解决方案1】:

你可以这样试试.....

注意:这只是关于如何使用两个下拉列表中的选定值过滤网格视图的示例...

<%@ page autoeventwireup="true" codefile="FilterWithMultipleDropDownLists.aspx.cs"
        inherits="GridView_FilterWithMultipleDropDownLists" language="C#" masterpagefile="~/MasterPages/Default.master"
        title="GridView: Filter With Multiple DropDownLists" %>

<asp:content id="Content1" runat="Server" contentplaceholderid="ContentPlaceHolder1">
        <div>
                Select Supplier:
                <asp:dropdownlist id="ddlSuppliers" runat="server" appenddatabounditems="True" autopostback="True"
                        datasourceid="sdsSuppliers" datatextfield="CompanyName" datavaluefield="SupplierID">
                        <asp:listitem text="All Suppliers" value="-1">
                        </asp:listitem>
                </asp:dropdownlist>
                <asp:sqldatasource id="sdsSuppliers" runat="server" connectionstring="<%$ ConnectionStrings:NorthwindConnectionString %>"
                        selectcommand="SELECT [SupplierID], [CompanyName] FROM [Suppliers] ORDER BY [CompanyName]">
                </asp:sqldatasource>
        </div>
        <div style="margin-top: 12px;">
                Select Category:
                <asp:dropdownlist id="ddlCategories" runat="server" appenddatabounditems="True" autopostback="True"
                        datasourceid="sdsCategories" datatextfield="CategoryName" datavaluefield="CategoryID">
                        <asp:listitem text="All Categories" value="-1">
                        </asp:listitem>
                </asp:dropdownlist>
                <asp:sqldatasource id="sdsCategories" runat="server" connectionstring="<%$ ConnectionStrings:NorthwindConnectionString %>"
                        selectcommand="SELECT [CategoryID], [CategoryName] FROM [Categories] ORDER By [CategoryName]">
                </asp:sqldatasource>
        </div>
        <asp:gridview id="gvProducts" runat="server" autogeneratecolumns="False" datakeynames="ProductID"
                datasourceid="sdsProducts" style="margin-top: 24px;">
                <columns>
                        <asp:boundfield datafield="ProductID" headertext="ProductID" insertvisible="False"
                                readonly="True" sortexpression="ProductID" />
                        <asp:boundfield datafield="ProductName" headertext="ProductName" sortexpression="ProductName" />
                        <asp:boundfield datafield="CompanyName" headertext="Supplier" sortexpression="CompanyName" />
                        <asp:boundfield datafield="CategoryName" headertext="Category" sortexpression="CategoryName" />
                </columns>
        </asp:gridview>
        <asp:sqldatasource id="sdsProducts" runat="server" connectionstring="<%$ ConnectionStrings:NorthwindConnectionString %>"
                selectcommand="SELECT [P].[ProductID], [P].[ProductName], [P].[SupplierID], [P].[CategoryID], [S].[CompanyName], [C].[CategoryName] FROM [Products] AS [P] INNER JOIN [Suppliers] AS [S] ON [S].[SupplierID] = [P].[SupplierID] INNER JOIN [Categories] AS [C] ON [C].[CategoryID] = [P].[CategoryID] WHERE ([P].[SupplierID] = CASE WHEN @SupplierID = -1 THEN [P].[SupplierID] ELSE @SupplierID END AND [P].[CategoryID] = CASE WHEN @CategoryID = -1 THEN [P].[CategoryID] ELSE @CategoryID END) ORDER BY [P].[ProductName]">
                <selectparameters>
                        <asp:controlparameter controlid="ddlSuppliers" name="SupplierID" propertyname="SelectedValue" type="Int32" />
                        <asp:controlparameter controlid="ddlCategories" name="CategoryID" propertyname="SelectedValue" type="Int32" />
                </selectparameters>
        </asp:sqldatasource>
</asp:content>    

希望对你有帮助..

【讨论】:

  • 感谢您的建议,但我正在尝试使用存储过程来执行此操作。这是我得到的。
【解决方案2】:

最有效的方法是将下拉控件中选择的值传递给存储过程 usp_AllDataFlat_Select。在这个存储过程中,您应该能够只选择满足过滤器值的行。

如果您无权访问存储过程(无法修改它们),那么在我看来,实现此目的的最佳方法是将您对存储过程的调用包装在一个从数据中检索所有行的对象中base 并在内存中过滤它们(不是很有效)。然后,您可以使用 OnjectDataSource 而不是 SqlDataSource 来填充 gridview。这个 ObjectDataSoruce 可以调用包装存储过程的对象的方法。

您可以找到一个示例here。该示例使用查询而不是存储过程,但将查询替换为对存储过程的调用应该很简单。

祝你好运,

【讨论】:

    猜你喜欢
    • 2013-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-20
    • 1970-01-01
    • 2014-08-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多