我一直在为数据网格做自定义分页,我每页只检索10个值。所以,我开始这样做:
<asp:GridView ID="grid1" runat="server"
> </asp:GridView>
<asp:Button ID="Btn_Previous" CommandName="Previous" runat="server"
OnCommand="ChangePage" Text="Previous" />
<asp:Button ID="Btn_Next" runat="server" CommandName="Next" OnCommand="ChangePage"
Text="Next" />
<asp:Label ID="lblTotalPages" runat="server"></asp:Label>
<asp:Label ID="lblCurrentPage" runat="server"></asp:Label>
protected int currentPageNumber = 1;
protected const int PAGE_SIZE = 10;
protected int startrowindex=1;
protected void Page_Load(object sender, EventArgs e)
{
BindData();
}
private void BindData()
{
using (SqlConnection conn = new SqlConnection("Data Source=NISHANTH-PC\\SQLEXPRESS;Initial Catalog=Northwind;Integrated Security=True"))
{
conn.Open();
SqlCommand myCommand = new SqlCommand("GetProductsPaged",
conn);
myCommand.CommandType = CommandType.StoredProcedure;
myCommand.Parameters.AddWithValue("@startRow",
startrowindex);
myCommand.Parameters.AddWithValue("@maximumRows", PAGE_SIZE);
myCommand.Parameters.Add("@totalRows", SqlDbType.Int, 4);
myCommand.Parameters["@totalRows"].Direction = ParameterDirection.Output;
SqlDataAdapter ad = new SqlDataAdapter(myCommand);
DataSet ds = new DataSet();
ad.Fill(ds);
grid1.DataSource = ds;
grid1.DataBind();
double totalRows = (int)myCommand.Parameters["@totalRows"].Value;
lblTotalPages.Text = CalculateTotalPages(totalRows).ToString();
lblCurrentPage.Text = currentPageNumber.ToString();
if (currentPageNumber == 1)
{
Btn_Previous.Enabled = false;
if (Int32.Parse(lblTotalPages.Text) > 0)
{
Btn_Next.Enabled = true;
}
else
Btn_Next.Enabled = false;
}
else
{
Btn_Previous.Enabled = true;
if (currentPageNumber == Int32.Parse(lblTotalPages.Text))
Btn_Next.Enabled = false;
else Btn_Next.Enabled = true;
}
conn.Close();
}
}
private int CalculateTotalPages(double totalRows)
{
int totalPages = (int)Math.Ceiling(totalRows / PAGE_SIZE);
return totalPages;
}
protected void ChangePage(object sender, CommandEventArgs e)
{
switch (e.CommandName)
{
case "Previous":
currentPageNumber = currentPageNumber - 1;
startrowindex = startrowindex - 10;
break;
case "Next":
currentPageNumber = currentPageNumber + 1;
startrowindex = startrowindex + 10;
break;
}
BindData();
}
基本上,我的问题是网页加载时网格工作正常。然后,由于之前是隐藏的,当我点击下一步它进入第二页并完美地检索值。但是,当我现在点击下一个或上一个时,它就会出错。我认为的原因是,当我回来时,top上的currentpagenumber值再次变为1,startroeindex也变为1.你可以让我知道我能处理的方式吗?
答案 0 :(得分:0)
我不知道您的aspx页面,但您需要一种方法来发送上一页码。否则,您的脚本不知道下一个意味着什么,除了1 + 1。你如何改变页面?超链接?如果是,请在表单字段或查询字符串中发送最后一页。
答案 1 :(得分:0)
首先,你要在每个帖子上加载BindData,你必须只在第一次加载时调用它。
第二件事,你正在存储标签,lblCurrentPage.Text = currentPageNumber.ToString();
那么为什么不使用相同的内容并将其再次存储在page_load事件中。
我在这里提供了page_load事件试试这个。
protected void Page_Load(object sender, EventArgs e)
{
currentPageNumber = Convert.ToInt32(lblCurrentPage.Text);
if(!IsPostback)
{
BindData();
}
}
请将lblCurrentPage.Text的默认值添加到1。