Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net GridView和SqlDataSoruce排序问题_Asp.net_Sorting_Gridview - Fatal编程技术网

Asp.net GridView和SqlDataSoruce排序问题

Asp.net GridView和SqlDataSoruce排序问题,asp.net,sorting,gridview,Asp.net,Sorting,Gridview,我有非常基本的产品数据表,我将我的网格视图数据源设置为sqlDataSoruce,分页和排序选项为true 但我也有一个下拉列表,如果用户选择某个产品组(蔬菜、水果、冷冻食品等),网格视图只显示该产品组的项目 String sqlSearchByProduct = " SELECT ID, pID,pGroupID, pName, pPrice, Status, Stock FROM productsTable WHERE (pGroupID= ProductGroupIDDropDownLi

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

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

String sqlSearchByProduct = " SELECT ID, pID,pGroupID, pName, pPrice, Status, Stock FROM productsTable  WHERE (pGroupID= ProductGroupIDDropDownList.SelectedItem.Value)";
    sqlDataSource.SelectCommand = sqlSearchByProduct ; 
网格显示从dropdownlist中选择的groupID中的所有产品,但问题是当我想按名称或价格对其排序时,网格视图再次显示所有产品

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

您是否已将数据恢复到gridview,例如下面的

GridView1.DataBind();

您需要保留下拉列表的
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注入
攻击。始终使用参数。

谢谢你,Alex,谢谢你的帮助,但是如果我有多个DropDownList,我该怎么办。“从(CategoryID=@CategoryID)或(Price<@Price)或(inStock=@stockStatusTrue)等产品中选择Products.ProductID、Products.ProductName。如果用户只选择两个选项如何。@Adil完全相同。将参数添加到
SELECT
查询中,添加
dropdownlist
s并将所有参数设置为
AutoPostBack=“true”
。它们独立工作,将
select
作为过滤器的总和进行过滤。将
GridView
包装到
UpdatePanel
中以获得更好的性能。“如果用户只选择两个选项如何”。请参阅如何在我的答案中构建
where
子句。
where(@categoryid=0/*未选择任何内容*/或categoryid=@categoryid)
是的,我做了,没有任何变化。相同的问题
" ... WHERE (pGroupID= ProductGroupIDDropDownList.SelectedItem.Value)"