GridView 和 ListView 分页需要在 datapager 中单击两次

问题描述 投票:0回答:1

我有一个 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();
        }

       
c# asp.net listview pagination datapager
1个回答
0
投票

好吧,您已经删除/注释掉了数据页更改事件。

如果您没有连接事件,那么您就会遇到双击事件问题。

(您单击寻呼机 - 它将需要双击 - 甚至不起作用。

因此,您必须每次为数据寻呼机事件重新绑定 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();
}

看起来像这样:

enter image description here

但是说,我寻找任何带有lodge的酒店名称,我得到这个:

enter image description here

对于为什么过滤器是一个问题或问题,我有点“困惑”。我的意思是,一旦你让分页器工作起来,那么从一开始,对 sql 应用一些标准就是标准的公平 - 并且与这个整体问题(使用数据分页器)没有多大关系。

© www.soinside.com 2019 - 2024. All rights reserved.