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 MVC 和 AJAX 的分页表 [关闭]