【问题标题】:GridView and SqlDataSoruce SORTING issueGridView 和 SqlDataSoruce 排序问题
【发布时间】:2018-04-18 00:25:39
【问题描述】:

我有非常基本的产品数据表,我将我的网格视图数据源设置为 sqlDataSoruce,分页和排序选项为 true。

但我也有一个 DropDownList,如果用户选择某个产品组(蔬菜、水果、冷冻食品等),网格视图仅显示该产品组项目。

String sqlSearchByProduct = " SELECT ID, pID,pGroupID, pName, pPrice, Status, Stock FROM productsTable  WHERE (pGroupID= ProductGroupIDDropDownList.SelectedItem.Value)";
    sqlDataSource.SelectCommand = sqlSearchByProduct ; 

网格显示从下拉列表中选择的 groupID 中的所有产品,但问题是当我想按名称或价格对其进行排序时,网格视图再次显示所有产品。

如果您知道如何解决此问题,我将不胜感激。 谢谢。

【问题讨论】:

    标签: asp.net sorting gridview


    【解决方案1】:

    您需要保留下拉列表的SelectedValue,最简单的方法是以声明方式绑定所有数据。像这样的:

    <asp:DropDownList ID="ddCategory" runat="server" DataTextField="categoryname"
        DataValueField="categoryid"
        AppendDataBoundItems="true" DataSourceID="sqlCategory" AutoPostBack="true">
        <asp:ListItem Value="0" Text="- Select -"></asp:ListItem>
    </asp:DropDownList>
    
    <asp:SqlDataSource ID="sqlCategory" runat="server" ConnectionString="<%$ ConnectionStrings:NorthwindCnn %>"
        SelectCommand="select categoryid,categoryname from dbo.categories">
    </asp:SqlDataSource>
    
    <asp:GridView ID="gvProducts" runat="server" AutoGenerateColumns="False" AllowPaging="True" PageSize="5" DataKeyNames="ProductID" DataSourceID="sqlNWind">
        <Columns>
            <asp:BoundField DataField="ProductID" HeaderText="ProductID" InsertVisible="False" ReadOnly="True" SortExpression="ProductID" />
            <asp:BoundField DataField="ProductName" HeaderText="ProductName" SortExpression="ProductName" />
        </Columns>
    </asp:GridView>
    
    <asp:SqlDataSource ID="sqlNWind" runat="server" ConnectionString="<%$ ConnectionStrings:NorthwindCnn %>"
        SelectCommand="SELECT Products.ProductID, Products.ProductName FROM Products where (@categoryid=0 or CategoryID=@categoryId)">
        <SelectParameters>
            <asp:ControlParameter Name="categoryid" ControlID="ddCategory" Type="Int32" PropertyName="SelectedValue" />
        </SelectParameters>
    </asp:SqlDataSource>
    

    不需要后面的代码。

    旁注:永远不要像这样构建 sql 查询字符串

    " ... WHERE (pGroupID= ProductGroupIDDropDownList.SelectedItem.Value)"
    

    这样的代码容易受到SQL Injection 攻击。始终使用参数。

    【讨论】:

    • 感谢 Alex 的帮助,但如果我有多个 DropDownList,我该怎么办。 " SELECT Products.ProductID, Products.ProductName FROM Products where (CategoryID=@categoryId) or (Price
    • @Adil 都一样。向select查询添加参数,添加dropdownlists并设置所有参数AutoPostBack="true"。它们独立工作并将select 过滤为过滤器的总和。将GridView 包装成UpdatePanel 以获得更好的性能。
    • “如果用户只选择两个选项怎么样”。看看我的回答中如何构建where 子句。 where (@categoryid=0 /*nothing selected*/ or CategoryID=@categoryId)
    【解决方案2】:

    您是否将数据反弹到网格视图,例如下面

    GridView1.DataBind();
    

    【讨论】:

    • 是的,我做到了,没有任何改变。同样的问题
    猜你喜欢
    • 2011-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-09
    • 1970-01-01
    • 2012-02-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多