ASP.NET C#GridView在分页或排序时丢失搜索选项

ASP.NET C#GridView在分页或排序时丢失搜索选项,c#,asp.net,sorting,gridview,paging,C#,Asp.net,Sorting,Gridview,Paging,一天中的大部分时间里,我都在通过研究来解决这个问题,但我一直无法找到一个适用于我当前代码的答案。我设置了一个GridView,它由三个下拉列表和一个文本框控制。随着这些更改,这将构建SQL语句的WHERE部分,因此我只能提取所需的数据 我担心的是,其中大多数都会拉取数千个数据点,因此我希望使用该选项在GridView中翻页和/或按列排序 页面和排序最初起作用,但现在每次尝试页面或排序时,我只会得到一个空白的GridView ASPX文件: <%@ Page Language="C#" Au

一天中的大部分时间里,我都在通过研究来解决这个问题,但我一直无法找到一个适用于我当前代码的答案。我设置了一个GridView,它由三个下拉列表和一个文本框控制。随着这些更改,这将构建SQL语句的WHERE部分,因此我只能提取所需的数据

我担心的是,其中大多数都会拉取数千个数据点,因此我希望使用该选项在GridView中翻页和/或按列排序

页面和排序最初起作用,但现在每次尝试页面或排序时,我只会得到一个空白的GridView

ASPX文件:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="TestAsset.Default" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
        <hr />
    <div>
        <a href="Upload.aspx">Manual Assets</a>
    </div>
        <hr />
    <div>
        <asp:DropDownList ID="ddlSource" runat="server" AutoPostBack="true" Width="100px" OnSelectedIndexChanged="ddlSource_SelectedIndexChanged">
            /* Removed to Protect the Innocent */
        </asp:DropDownList>
        <asp:DropDownList ID="ddlAssetType" runat="server" AutoPostBack="true" Width="150px" OnSelectedIndexChanged="ddl_SelectedIndexChanged">
            <asp:ListItem Selected="True" Text="ALL" Value="0" />
        </asp:DropDownList>
        <asp:TextBox ID="tbAsset" runat="server" AutoPostBack="false" Width="500px" OnTextChanged="ddl_SelectedIndexChanged" />
        <asp:DropDownList ID="ddlSSP" runat="server" AutoPostBack="true" Width="250px" OnSelectedIndexChanged="ddl_SelectedIndexChanged">
            <asp:ListItem Selected="True" Text="ALL" Value="0" />
        </asp:DropDownList>
    </div>
        <hr />
    <div>
        <asp:GridView ID="gvAllAssets" runat="server" AllowPaging="True" AllowSorting="True" AutoGenerateColumns="False" CellPadding="4" ForeColor="#333333" GridLines="Vertical" PageSize="25" OnPageIndexChanging="gvAllAssets_PageIndexChanging" OnSorting="gvAllAssets_Sorting">
            <AlternatingRowStyle BackColor="White" ForeColor="#284775" />
            <EditRowStyle BackColor="#999999" />
            <EmptyDataTemplate>No Data Found</EmptyDataTemplate>
            <FooterStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" />
            <HeaderStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" />
            <PagerStyle BackColor="#284775" ForeColor="White" HorizontalAlign="Center" />
            <RowStyle BackColor="#F7F6F3" ForeColor="#333333" />
            <SelectedRowStyle BackColor="#E2DED6" Font-Bold="True" ForeColor="#333333" />
            <SortedAscendingCellStyle BackColor="#E9E7E2" />
            <SortedAscendingHeaderStyle BackColor="#506C8C" />
            <SortedDescendingCellStyle BackColor="#FFFDF8" />
            <SortedDescendingHeaderStyle BackColor="#6F8DAE" />
            <Columns>
                <asp:BoundField DataField="SOURCENAME" HeaderText="Source" InsertVisible="false" ReadOnly="true" SortExpression="SOURCENAME">
                    <ItemStyle Width="100px" Wrap="false" />
                </asp:BoundField>
                <asp:BoundField DataField="ASSETNAME" HeaderText="Asset Type" InsertVisible="false" ReadOnly="true" SortExpression="ASSETNAME">
                    <ItemStyle Width="150px" Wrap="false" />
                </asp:BoundField>
                <asp:BoundField DataField="ASSET" HeaderText="Asset" InsertVisible="false" ReadOnly="true" SortExpression="ASSET">
                    <ItemStyle Width="500px" Wrap="false" />
                </asp:BoundField>
                <asp:BoundField DataField="SSP" HeaderText="System Security Plan" InsertVisible="false" ReadOnly="true" SortExpression="SSP">
                    <ItemStyle Width="250px" Wrap="false" />
                </asp:BoundField>
                <asp:BoundField DataField="LAST_UPDATED" HeaderText="Last Updated" InsertVisible="false" ReadOnly="true" SortExpression="LAST_UPDATED">
                    <ItemStyle Width="250px" Wrap="false" />
                </asp:BoundField>
            </Columns>
        </asp:GridView>

        <asp:SqlDataSource ID="dsAllAssets" runat="server" ConnectionString="<%$ ConnectionStrings:TestAssetConnectionString %>" />
    </div>
        <hr />
    <div>
        <asp:Label ID="lblSQLStatement" runat="server" />
    </div>
        <hr />
    </form>
</body>
</html>

编辑2016年11月4日



我现在承认,我在ASP.net方面不是最棒的,但有人告诉我,我需要做一些东西来显示数据库中的内容。对搜索选项有点过分热情,为了让它发挥作用,我们为此奋斗了一段时间。然后我继续恢复了代码的备份副本,它再次进行搜索、分页和排序。。。因为我在HTML代码中再次设置了DataSourceID,最初我将其取出,以便在没有显示数据的情况下显示一些有趣的内容。所以现在就把它留在那里,继续前进

首先要尝试的是,使用GridView的
.DataSource
属性,而不是
.DataSourceID
。提供
DataSourceID
会导致在页面生命周期中发生某些自动绑定操作。由于您试图通过特定的输入事件自行管理数据绑定,因此不希望调用其他数据绑定

此外,你真的让事情变得更加困难。当您试图使用用户输入减少数据集时,存储过程的工作效果要好得多。更好的做法是利用SqlDataSource的全部功能来接受WebControl作为输入参数,例如:

    <asp:SqlDataSource ID="dsAllAssets" runat="server" ConnectionString="<%$ ConnectionStrings:TestAssetConnectionString %>" 
        SelectCommand="sp_SomeProcedureYouCreate" 
        SelectCommandType="StoredProcedure">
      <SelectParameters>
        <asp:ControlParameter Name="sp_var_1" ControlID="ddlAssetType" PropertyName="SelectedValue" Type="Int32" />
        <asp:ControlParameter Name="sp_var_2" ControlID="tbAsset" PropertyName="Text" Type="String" />
        <asp:ControlParameter Name="sp_var_3" ControlID="ddlSSP" PropertyName="SelectedValue" Type="Int32" />
      </SelectParameters>
    </asp:SqlDataSource>

通过这种方式,您可以设置:

    <asp:GridView ID="gvAllAssets" runat="server" DataSourceID="dsAllAssets" ... />


将输入
DropDownList
TextBox
控件设置为在更改为重新绑定时回发。或者设置一个按钮,在用户进行输入选择后只回发一次

谢谢您的建议!我正在研究修改我的代码,看看它是否能在StoredProcess中更高效地运行,尽管我必须研究如何处理WHERE子句可能有24种组合这一事实。这是因为有了三个下拉列表和一个文本框,用户可以不选择任何一个,一个,两个,三个,或者全部四个。这是一个设计考虑。但是,同样可以设置任意数量的
SqlDatasource
s以使用相同的输入控件,但为每个控件提供不同的存储过程,然后将GridView
DataSourceID
设置为适当的源。还要记住,数据绑定控件上的
可见性
属性在数据绑定操作中起作用。即使设置了
DataSourceID
,不可见控件也不会进行数据绑定
    <asp:GridView ID="gvAllAssets" runat="server" DataSourceID="dsAllAssets" ... />