当我单击
btn_Last
按钮时,出现此错误:
System.IndexOutOfRangeException:“索引 -6 为负数或超过行数。
每当我更改 pagesize 值时,我更改的值与它给出的错误中的索引值相同。
public partial class mainpage : System.Web.UI.Page
{
//string connection = "Data Source=localhost;Initial Catalog=Sefa;Integrated Security=True";
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
ItemsGet();
}
}
PagedDataSource objPds = new PagedDataSource();
private void ItemsGet()
{
SqlConnection baglanti = new SqlConnection(connection);
string komut = string.Format("SELECT * FROM Users");
baglanti.Open();
SqlCommand command = new SqlCommand(komut, baglanti);
SqlDataAdapter dataAdapter = new SqlDataAdapter(command);
DataSet dataSet = new DataSet();
dataAdapter.Fill(dataSet);
PagedDataSource objPds = new PagedDataSource();
objPds.AllowPaging = true;
objPds.PageSize = 6;
objPds.DataSource = dataSet.Tables[0].DefaultView;
objPds.CurrentPageIndex = CurrentPage;
lblCurrentPage.Text = "Page: " + (CurrentPage + 1).ToString() + " of " + objPds.PageCount.ToString();
btnFirst.Enabled = !objPds.IsFirstPage;
btnPre.Enabled = !objPds.IsFirstPage;
btnNext.Enabled = !objPds.IsLastPage;
btnLast.Enabled = !objPds.IsLastPage;
DataList2.DataSource = objPds;
DataList2.DataBind();
baglanti.Close();
}
protected void btnFirst_Click(object sender, EventArgs e)
{
CurrentPage = 0;
ItemsGet();
}
protected void btnPre_Click(object sender, EventArgs e)
{
//if (CurrentPage > 0)
//{
CurrentPage -= 1;
ItemsGet();
//}
}
protected void btnNext_Click(object sender, EventArgs e)
{
//if (CurrentPage < objPds.PageCount - 1)
//{
CurrentPage += 1;
ItemsGet();
//}
}
protected void btnLast_Click(object sender, EventArgs e)
{
int lastPageIndex = objPds.PageCount - 1;
CurrentPage = lastPageIndex;
ItemsGet();
}
public int CurrentPage
{
get {
object o = this.ViewState["_CurrentPage"];
if (o == null)
{
return 0;
}
else
{
return (int)o;
}
}
set {
this.ViewState["_CurrentPage"] = value;
}
}
}
为了解决这个问题,当我在 btnPre_Click 按钮和 btnNext_Click 按钮上添加当前注释的行时,页面之间的过渡不起作用,因此这些按钮也会解码。
请记住,每次回发(包括每个事件处理程序)时,您都在使用类的全新实例。
这意味着
ItemsGet()
方法(该方法会加载数据,以便 objPds.PageCount
值正确)在调用 btnLast_Click
时尚未运行。
您应该将
ItemsGet()
分为两种方法。一是进行数据库调用并设置数据源。无论是否是回发,这都将“始终”在页面生命周期的早期运行。另一个方法将根据当前页面和正在进行的事件来处理设置标签和显示右侧按钮的相关操作。然后按钮事件不需要调用第一个方法;只有第二个。