ASP.NET C#GridView在分页或排序时丢失搜索选项
一天中的大部分时间里,我都在通过研究来解决这个问题,但我一直无法找到一个适用于我当前代码的答案。我设置了一个GridView,它由三个下拉列表和一个文本框控制。随着这些更改,这将构建SQL语句的WHERE部分,因此我只能提取所需的数据 我担心的是,其中大多数都会拉取数千个数据点,因此我希望使用该选项在GridView中翻页和/或按列排序 页面和排序最初起作用,但现在每次尝试页面或排序时,我只会得到一个空白的GridView ASPX文件: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
<%@ 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以使用相同的输入控件,但为每个控件提供不同的存储过程,然后将GridViewDataSourceID
设置为适当的源。还要记住,数据绑定控件上的可见性
属性在数据绑定操作中起作用。即使设置了DataSourceID
,不可见控件也不会进行数据绑定
<asp:GridView ID="gvAllAssets" runat="server" DataSourceID="dsAllAssets" ... />