我有一个 ListView(带有搜索栏),将来自 SQL Server 的数据绑定到其中,并使用 DataPager 控件来分解所有信息。我遇到的问题是,当搜索后加载第一页时,我必须在任何页面链接或下一个/最后一个按钮上单击两次才能显示新页面。有人可以帮我吗?
数据分页器代码:
<div id="pagging" runat="server">
<asp:DataPager ID="DataPager1" runat="server" PagedControlID="ListView1" PageSize="9" >
<Fields>
<asp:NextPreviousPagerField NextPageText=" Next <i class='fa fa-chevron-left'></i> " ShowNextPageButton="true"
ShowPreviousPageButton="false" ShowFirstPageButton="false"
ButtonCssClass="btn btn-default" RenderNonBreakingSpacesBetweenControls="false" RenderDisabledButtonsAsLabels="false" />
<asp:NumericPagerField ButtonType="Link" CurrentPageLabelCssClass="btn btn-primary disabled" RenderNonBreakingSpacesBetweenControls="false"
NumericButtonCssClass="btn btn-default" ButtonCount="10" NextPageText="..." NextPreviousButtonCssClass="btn btn-default" />
<asp:NextPreviousPagerField PreviousPageText=" <i class='fa fa-chevron-right'></i> Prev" ShowPreviousPageButton="true"
ShowNextPageButton="false" ShowLastPageButton="false"
ButtonCssClass="btn btn-default" RenderNonBreakingSpacesBetweenControls="false" RenderDisabledButtonsAsLabels="false" />
</Fields>
</asp:DataPager>
</div>
C#
protected void Page_Load(object sender, EventArgs e){
if (!IsPostBack)
BindListView();
}
private void SearchCustomers()
{
"select * from aspnet_table where *** ", conString);
DataTable dtTable = new DataTable();
dad.Fill(dtTable);
using (DataTable dt1 = new DataTable())
{
ListView1.DataSource = dtTable;
ListView1.DataBind();
}
}
protected void Search(object sender, EventArgs e)
{
SearchCustomers();
}
private void BindListView()
{
ListView1.DataSource = db.aspnet_table;
ListView1.DataBind();
}
protected void list_PagePropertiesChanging(object sender, PagePropertiesChangingEventArgs e)
{
//set current page startindex, max rows and rebind to false
//DataPager1.SetPageProperties( e.MaximumRows, e.StartRowIndex, false); when i remove comment here the second page need one click but data without applay search
//rebind List View
//BindListView();
}
好吧,您已经删除/注释掉了数据页更改事件。
如果您没有连接事件,那么您就会遇到双击事件问题。
(您单击寻呼机 - 它将需要双击 - 甚至不起作用。
因此,您必须每次为数据寻呼机事件重新绑定 lv。
因此,我建议您构建/制作一个单一列表视图数据加载器。并且您将过滤器保留在 ViewState (或隐藏控件)中。
所以,我建议:
protected void ListView1_PagePropertiesChanging(object sender, PagePropertiesChangingEventArgs e)
{
DataPager1.SetPageProperties(e.StartRowIndex, e.MaximumRows, false);
ListView1.DataSource = MyTableWithFilter;
ListView1.DataBind();
}
现在 MyTableWithFitler - 也许它返回一个在没有过滤器的情况下启动的“数据表”表 - 但您需要在页面更改事件中重新绑定事件。如果您没有正确连接该事件,并重新绑定该寻呼机事件,那么您将得到您所看到的双击问题/效果。
因此,如果过滤器处于活动状态,则该例程必须返回过滤后的数据,如果没有过滤器,则必须返回整个表。但是每个寻呼机事件都需要重新绑定(无论您是否有某些过滤器处于活动状态)。
编辑:所以问的问题是如何过滤?
那应该很容易。
假设我们有这个标记 - 我将使用您的寻呼机:
<br />
<asp:Label ID="Label1" runat="server" Text="Search For Hotel Name:"></asp:Label>
<asp:TextBox ID="txtHotel" runat="server" style="margin-left:20px;width:150px"></asp:TextBox>
<asp:Button ID="cmdSearch" runat="server" Text="Search" style="margin-left:20px;width:90px" />
<asp:Button ID="cmdClear" runat="server" Text="Clear Search" style="margin-left:20px;width:110px" />
<br />
<div id="mygrid" style="width:40%">
<asp:ListView ID="ListView1" runat="server" Allowpaging="true" >
<ItemTemplate >
<tr>
<td><asp:Label ID="FirstNameLabel" runat="server" Text='<%# Eval("FirstName") %>' /></td>
<td><asp:Label ID="LastNameLabel" runat="server" Text='<%# Eval("LastName") %>' /></td>
<td><asp:Label ID="HotelNameLabel" runat="server" Text='<%# Eval("HotelName") %>' /></td>
<td><asp:Label ID="CityNameLabel" runat="server" Text='<%# Eval("City") %>' /></td>
<td><asp:Label ID="ProvinceLabel" runat="server" Text='<%# Eval("Province") %>' /></td>
</tr>
</ItemTemplate>
<LayoutTemplate>
<table id="itemPlaceholderContainer" runat="server" border="0" class="table table-hover">
<tr runat="server" >
<th runat="server">FirstName</th>
<th runat="server">LastName</th>
<th runat="server">HotelName</th>
<th runat="server">City</th>
<th runat="server">Province</th>
</tr>
<tr id="itemPlaceholder" runat="server" >
</tr>
</table>
</LayoutTemplate>
</asp:ListView>
</div>
<div id="pagging" runat="server">
<asp:DataPager ID="DataPager1" runat="server" PagedControlID="ListView1" PageSize="9" >
<Fields>
<asp:NextPreviousPagerField NextPageText=" Next <i class='fa fa-chevron-left'></i> " ShowNextPageButton="true"
ShowPreviousPageButton="false" ShowFirstPageButton="false"
ButtonCssClass="btn btn-default" RenderNonBreakingSpacesBetweenControls="false" RenderDisabledButtonsAsLabels="false" />
<asp:NumericPagerField ButtonType="Link" CurrentPageLabelCssClass="btn btn-primary disabled" RenderNonBreakingSpacesBetweenControls="false"
NumericButtonCssClass="btn btn-default" ButtonCount="10" NextPageText="..." NextPreviousButtonCssClass="btn btn-default" />
<asp:NextPreviousPagerField PreviousPageText=" <i class='fa fa-chevron-right'></i> Prev" ShowPreviousPageButton="true"
ShowNextPageButton="false" ShowLastPageButton="false"
ButtonCssClass="btn btn-default" RenderNonBreakingSpacesBetweenControls="false" RenderDisabledButtonsAsLabels="false" />
</Fields>
</asp:DataPager>
所以我只是添加了一个文本框和一个搜索按钮。
所以,现在代码如下所示:
protected void Page_Load(object sender, System.EventArgs e)
{
if (IsPostBack == false)
LoadGrid();
}
public void LoadGrid()
{
using (SqlCommand cmdSQL = new SqlCommand("Select * FROM tblHotels",
new SqlConnection(My.Settings.TEST3)))
{
// check for filter
if (txtHotel.Text != "")
{
cmdSQL.CommandText += " WHERE HotelName like '%' + @Hotel +'%' ";
cmdSQL.Parameters.Add("@Hotel", SqlDbType.NVarChar).Value = txtHotel.Text;
}
cmdSQL.CommandText += " ORDER BY HotelName";
DataTable MyTable = new DataTable();
cmdSQL.Connection.Open();
MyTable.Load(cmdSQL.ExecuteReader);
ListView1.DataSource = MyTable;
ListView1.DataBind();
}
}
protected void ListView1_PagePropertiesChanging(object sender, PagePropertiesChangingEventArgs e)
{
DataPager1.SetPageProperties(e.StartRowIndex, e.MaximumRows, false);
LoadGrid();
}
protected void cmdSearch_Click(object sender, EventArgs e)
{
// with filter - always jump to first page first time.
DataPager1.SetPageProperties(0, DataPager1.MaximumRows, false);
LoadGrid();
}
protected void cmdClear_Click(object sender, EventArgs e)
{
txtHotel.Text = "";
LoadGrid();
}
看起来像这样:
但是说,我寻找任何带有lodge的酒店名称,我得到这个:
对于为什么过滤器是一个问题或问题,我有点“困惑”。我的意思是,一旦你让分页器工作起来,那么从一开始,对 sql 应用一些标准就是标准的公平 - 并且与这个整体问题(使用数据分页器)没有多大关系。