ASP.NET 中的分页;过滤后页数不变

Posted

技术标签:

【中文标题】ASP.NET 中的分页;过滤后页数不变【英文标题】:Paging in ASP.NET; the number of pages never changes after filtering 【发布时间】:2016-07-31 18:32:50 【问题描述】:

当您打开只有一条记录的页面时会出现问题。它用三个链接填充 NavMenu; “第一个”、“1”和“最后一个”。

由于某种原因,当您运行将返回多个页面的搜索查询时,它仍然只显示“第一个”、“1”和“最后一个”。同样,如果您从四页开始,而您的后续搜索查询只返回两条记录,它仍然显示“First”、“1”、“2”、“3”、“4”和“Last”。因此,出于某种原因,无论您从多少页开始,您总会得到。如何重置页面计数器/显示?

这是我的 C# 代码隐藏:

public void RunTheSearch()

    //Run the Stored Procedure first
    SqlConnection connection2 = new SqlConnection(strCon1);
    SqlCommand cmd2 = new SqlCommand();
    cmd2.CommandType = CommandType.StoredProcedure;
    cmd2.CommandText = "sp_Search";
    cmd2.Connection = connection2;

    //--- A bunch of code that returns a dataset. Lengthy and unnecessary to my issue

    connection2.Open();

    SqlDataAdapter adp = new SqlDataAdapter(cmd2);


    DataSet ds = new DataSet();
    adp.Fill(ds, "OLDPages");

    //Pagination code so only a set number of records loads at a time.
    //  Done to speed up the loading, since this list gets really long.
    PagedDataSource pds = new PagedDataSource();
    pds.DataSource = ds.Tables["OLDPages"].DefaultView;

    pds.AllowPaging = true;
    pds.PageSize = 10;
    //NavMenu.Items.Clear();

    int currentPage;

    if (Request.QueryString["page"] != null)
    
        currentPage = Int32.Parse(Request.QueryString["page"]);
    
    else
    
        currentPage = 1;
    

    pds.CurrentPageIndex = currentPage - 1;
    //Label1.Text = "Page " + currentPage + " of " + pds.PageCount;


    if (!pds.IsFirstPage)
    
        MenuItem itemMessage = NavMenu.FindItem("First");
        itemMessage.NavigateUrl = Request.CurrentExecutionFilePath + "?page=1";
    

    AcctRepeater.DataSource = pds;
    AcctRepeater.DataBind();

    CreatePagingControl(pds.PageCount, pds.CurrentPageIndex);
    // End of Pagination code

    connection2.Close();


private void CreatePagingControl(int PCount, int PIndex)

    int PIndex2 = 0;
    int SCounter = PIndex + 1;
    int RowCount = PCount;

    //Allow the pagination menu to always start 5 less than the current page you're on
    if (PIndex < 5)
    
        PIndex2 = 0;
    
    else
    
        PIndex2 = PIndex - 5;
    

    // Show 10 total page numbers.  You can increase or shrink that range by changing the 10 to whatever number you want
    for (int i = PIndex2; i < PIndex2 + 10 && i < PCount; i++)
    
        NavMenu.Items.Add(new MenuItem
        
            Text = (i + 1).ToString(),
            NavigateUrl = Request.CurrentExecutionFilePath + "?page=" + (i + 1).ToString()
        );

        // Now determine the selected item so the proper CSS can be applied
        foreach (MenuItem item in NavMenu.Items)
        
            item.Selected = item.Text.Equals(SCounter.ToString());
        
    

    NavMenu.Items.Add(new MenuItem
    
        Text = "Last",
        NavigateUrl = Request.CurrentExecutionFilePath + "?page=" + (PCount)
    );

在aspx页面上:

<asp:Menu ID="NavMenu" runat="server" CssClass="menu"
    IncludeStyleBlock="false" Orientation="Horizontal" 
    BackColor="#CC3300" EnableViewState="true">
    <Items>
        <asp:MenuItem NavigateUrl="~/Default.aspx" Text="First" Selectable="true" />
    </Items>
</asp:Menu>

我确实尝试过 NavMenu.Items.Clear(),但它不喜欢这样,因为它还清除了 aspx 端的硬编码项。

【问题讨论】:

您可以使用Remove(MenuItem) 来选择性地删除MenuItems,而不是Clear() 你能发布你的页面加载方法吗? 【参考方案1】:

最终通过将菜单放在更新面板中解决了这个问题。所以,在 aspx 方面我现在有:

<div class="clear hideSkiplink" id="NavDiv" style="margin:0 auto; display: table;">
    <asp:UpdatePanel ID="NavUpdatePanel" runat="server" UpdateMode="Conditional">
        <ContentTemplate>
            <asp:Menu ID="NavMenu" runat="server" CssClass="menu" 
                IncludeStyleBlock="false" Orientation="Horizontal" 
                BackColor="#CC3300" EnableViewState="false">
                <Items> 
                    <asp:MenuItem NavigateUrl="~/Default.aspx" Text="First" Selectable="true" />
                </Items>
            </asp:Menu>
        </ContentTemplate>
    </asp:UpdatePanel>
</div>

感谢所有尝试过的人。实际上是在回复帖子时,我的大脑发生了变化,并产生了尝试的想法。

【讨论】:

【参考方案2】:

您正在从名为sp_Search 的存储过程中检索数据,但您在所有运行中的查询都是相同的,因为您没有在存储过程中指定任何参数(基于您发布的代码)。我通过修改存储过程并向其发送参数并使用NavMenu.Items.Clear() 来测试您的代码,正如您所说,它对我来说很好:

你的 SP 应该是这样的:

CREATE PROCEDURE [dbo].[sp_Search]
    @param1 NVARCHAR(50)
AS
    SELECT * from yourTableName where SearchField = @param1
RETURN 0

在 c# 中:

public void RunTheSearch(string id)

    ...
    cmd2.CommandType = CommandType.StoredProcedure;
    cmd2.CommandText = "sp_Search";
    cmd2.Parameters.Add("@param1", SqlDbType.NVarChar, 50).Value = id;
    ...
    ...

因此,在您的Page_Load 中,通过传递一个返回一条记录的参数来调用RunTheSearch 方法:

protected void Page_Load(object sender, EventArgs e)

    RunTheSearch("p1");            

在其他地方调用RunTheSearch方法,通过传递一个返回多条记录的参数,结果将超过一页:

protected void Button1_OnClick(object sender, EventArgs e)

    NavMenu.Items.Clear();
    RunTheSearch("p2");

【讨论】:

【参考方案3】:

我无法复制它。

我的直觉告诉我你没有回帖,这就是为什么你需要 clear() 结果。

此 C# 代码运行良好。

protected void Page_Load(object sender, EventArgs e)

    RunTheSearch();

【讨论】:

这个答案不正确,它没有解决我的问题。 正确,我无法使用您提供的确切代码重现问题!我给了你一个关于追求什么方向的线索。花 1/2 小时试图帮助你也投反对票?残酷的。不会再这样做了。

以上是关于ASP.NET 中的分页;过滤后页数不变的主要内容,如果未能解决你的问题,请参考以下文章

asp.net core 排序过滤分页组件:sieve

带有 ASP.NET MVC 和 AJAX 的分页表 [关闭]

Asp.net MVC 4 / 5 中的分页

asp.net webforms中Jquery Datatable中的分页

基于 mybatis 的分页和过滤查询

过滤后更新AngularJS中的分页