100分求助!!!极度郁闷的错误..不知道错在哪里..关于DATAGRID分页的

losteve5 2005-05-18 07:41:30
想完成一个
"点击button后查找出数据表U中后缀如@163.com的电子邮件.并且以分页的形式显示在DATAGRID上"
的功能
程序如下.TextBox1.Text是输入163.com或者sina.com.cn

private void Page_Load(object sender, System.EventArgs e)
{
// 在此处放置用户代码以初始化页面
}

private void Button1_Click(object sender, System.EventArgs e)
{
BindGrid();
}

private void BindGrid()
{
DataSet ds=new DataSet();
SqlDataAdapter da=new SqlDataAdapter();
this.sqlConnection1.Open();
this.sqlCommand1.CommandText="select * from U where EMAIL like '%@"+TextBox1.Text+"'";
da.SelectCommand=this.sqlCommand1;
da.Fill(ds,"U");
this.DataGrid1.DataSource=ds;
this.DataGrid1.DataBind();
this.sqlConnection1.Close();

}

private void DataGrid1_PageIndexChanged(object source, System.Web.UI.WebControls.DataGridPageChangedEventArgs e)
{
DataGrid1.CurrentPageIndex = e.NewPageIndex;
BindGrid();
DataGrid1.DataBind();
}
}

现在的情况是分页功能顺利实现.
但是出现郁闷的问题是:
我的表里面有10条@163.com和1条@sina.com.cn为后缀的邮件记录.
我查询@163.com.查出来10条分页记录后后对DATAGRID进行翻页查看操作!!!!
然后我再查询@sina.com.cn时,出现了以下错误!!!:
无效的 CurrentPageIndex 值。它必须大于等于 0 且小于 PageCount

请问这是怎么回事,程序应该是对的呀,为什么会有冲突...
...全文
120 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
hchxxzx 2005-05-18
  • 打赏
  • 举报
回复
DataGrid翻页后删除记录出错的解决方案
在论坛里见过不少网友问过这样的问题:当DataGrid翻到最后一页后,如果当前页的数据只有一条,那么删除这条记录就会出现“异常详细信息: System.Web.HttpException: 无效的 CurrentPageIndex 值。它必须大于等于 0 且小于 PageCount。”这样的错误,出现这个错误的原因是当最后一页上的这条记录被删除并重新绑定数据之后,DataGrid的总页数减少了一页,而它的CurrentPageIndex属性值却仍然是删除记录前最后一页的页索引值,这个值超出了它的总页数。一些网友解决这个问题的方法是:在删除记录之后立即将DataGrid的CurrentPageIndex设为0,即跳回第一页,这个方法虽然可以避免再发生这样的错误,然而却很不灵活,因为如果用户要删除最后一页上的两条记录,那么在删除了其中一条后,不得不重新点击分页按钮进入最后一页来删除第二条,而且很多时候这种方法会给用户带来困扰,因为很容易把跳转到的第一页的数据当成是正执行删除命令的最后一页的数据,其实这个问题有更好的解决办法,如果我们用的是DataGrid的内建的删除功能,即一次只能删除一条记录的话,那么在它的DeleteCommand事件处理程序中,可以通过下面的方法,来实现当最后一页没有数据时,自动跳回前一页,否则只需要重新绑定数据即可:

void DataGrid1_Delete(object src,DataGridCommandEventArgs e){
//执行删除命令,从数据库或其它保存数据的地方删除DataGrid中对应的记录(略)
//如果当前页上只有一条数据并且DataGrid的当前页索引大于0,那么就让DataGrid返回上一页
if(DataGrid1.Items.Count==1&&DataGrid1.CurrentPageIndex>0){
DataGrid1.CurrentPageIndex--;
}
//重新绑定数据
BindData();
}

如果用了模板列中的CheckBox,实现一次删除多条选中的记录的话,那么可以在删除按钮的Click事件处理程序中这样来实现上面的功能:


void deleteButton_Click(object src,EventArgs e){
int deletedRows=0; //记录删除掉的行数
foreach(DataGridItem item in DataGrid1.Items){
if(item.ItemType==ListItemType.Item||item.ItemType==ListItemType.AlternatingItem){
CheckBox ckbox=item.FindControl("delckbox") as CheckBox;
if(ckbox!=null&&ckbox.Checked){
deletedRows++;
//从数据库或其它保存数据的地方删除DataGrid中对应的记录(略)
}
}
}
//如果当前页的记录总数等于已经被删除掉的记录数并且DataGrid当前页索引大于0,那么让DataGrid返回上一页
if(deletedRows==DataGrid1.Items.Count&&DataGrid.CurrentPageIndex>0){
DataGrid1.CurrentPageIndex--;
}
//重新绑定数据
BindData();
}
flyye_cs 2005-05-18
  • 打赏
  • 举报
回复
第一句和第二句不要写反了!!! 反了就错了~~~

private void Button1_Click(object sender, System.EventArgs e)
{
DataGrid1.CurrentPageIndex =0;
BindGrid();
}
losteve5 2005-05-18
  • 打赏
  • 举报
回复
顶!着急中!!给个改好的代码拜托了,,,我实在不知道插在哪里
xuehai001 2005-05-18
  • 打赏
  • 举报
回复
BindGrid();
DataGrid1.DataBind();第二句好像是多余的
losteve5 2005-05-18
  • 打赏
  • 举报
回复
晕...还是不行...理解不是很透彻现在,谁能给个改好的程序呀
liangfengxx(莫拿你的成绩证明你的能力)兄你的程序有错误哦
losteve5 2005-05-18
  • 打赏
  • 举报
回复
button里面的代码改为
private void Button1_Click(object sender, System.EventArgs e)
{
BindGrid();
DataGrid1.CurrentPageIndex =0;

}
刚测试下好象就OK了...还没具体测试...是不是这样改就行了呢?
losteve5 2005-05-18
  • 打赏
  • 举报
回复
楼上的朋友我用你的代码出现一个错误对话框...是JIT调试失败...汗
liangfengxx 2005-05-18
  • 打赏
  • 举报
回复
正好是我今天遇到的问题,跟你一样

这样解决:
在BindGrid中用try-catch语句把代码括起来
在catch块中,写一条语句:DataGrid1.CurrentPageIndex =0
然后再绑定:BindGrid(如果不写这一句的话,接着的一次不回显示)

如下所示:
private void BindGrid()
{
try{
DataSet ds=new DataSet();
SqlDataAdapter da=new SqlDataAdapter();
this.sqlConnection1.Open();
this.sqlCommand1.CommandText="select * from U where EMAIL like '%@"+TextBox1.Text+"'";
da.SelectCommand=this.sqlCommand1;
da.Fill(ds,"U");
this.DataGrid1.DataSource=ds;
this.DataGrid1.DataBind();
this.sqlConnection1.Close();
}
catch{
'把当前页设为0,即第一页
DataGrid1.CurrentPageIndex =0
'再调用它自己
BindGrid()
}
}
flyye_cs 2005-05-18
  • 打赏
  • 举报
回复
因为查询一次记录就会绑定一次数据集,而 DataGrid 是有状态的,一旦翻过页后, DataGrid1.CurrentPageIndex 就会更改一次,如果你再重新搜索匹配字符串而不将DataGrid的当前页重置为0就会出现 " 无效的 CurrentPageIndex 值。它必须大于等于 0 且小于 PageCount" 的错误!
wangsaokui 2005-05-18
  • 打赏
  • 举报
回复
重新绑定数据源需要设定DataGrid1.CurrentPageIndex =0
LoveCherry 2005-05-18
  • 打赏
  • 举报
回复
数据源里面得数据只有1页而datagrid得CurrentPageIndex已经=1了当然出错
flyye_cs 2005-05-18
  • 打赏
  • 举报
回复
点击查询按钮时先 执行 DataGrid1.CurrentPageIndex=0;
losteve5 2005-05-18
  • 打赏
  • 举报
回复
当我
我查询@163.com.查出来10条分页记录后
如果没有对DATAGRID进行翻页操作!
那么再查询@sina.com.cn时候.就不会出错!

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧