索引超出范围。必须为非负值并小于集合大小。 高手解决

yaoshun1983 2008-06-11 06:39:11
我建了一个留言板使用的repeater控件,并且给它分页。在添加留言没有分页时(即我限制每10条留言就开始分页,此时还没到10条留言)没有发现报错,但留言开始添加到超过10条时,就报错了。如下:

索引超出范围。必须为非负值并小于集合大小。
参数名: index
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。

异常详细信息: System.ArgumentOutOfRangeException: 索引超出范围。必须为非负值并小于集合大小。
参数名: index

源错误:


行 162: for (int i = 0; i < dsLeave.Tables["leave"].Rows.Count; i++)
行 163: {
行 164: Image temDelPic = (Image)Repeater1.Items[i].FindControl("delPic");
行 165: if (Request.Cookies["MktMemberCookies_3C"] == null)
行 166: { }


源文件: e:\n\my31net\corLeaveWord.aspx.cs 行: 164
...全文
6223 38 打赏 收藏 转发到动态 举报
写回复
用AI写文章
38 条回复
切换为时间正序
请发表友善的回复…
发表回复
vipyaoyuansheng 2010-10-26
  • 打赏
  • 举报
回复
for (int i = 0; i < dsLeave.Tables["leave"].Rows.Count-1; i++)
flyxc 2009-08-14
  • 打赏
  • 举报
回复
唉,真是什么事情都有哦...我的问题更郁闷,本地运行没问题,发布后报下标越界。真的很奇怪
alexjack1210 2009-05-19
  • 打赏
  • 举报
回复
索引超出范围。必须为非负值并小于集合大小。
参数名: index
xiazhongliang 2009-05-18
  • 打赏
  • 举报
回复
肯定是索引超出了界限
sun_Ke 2008-06-12
  • 打赏
  • 举报
回复
肯定是索引超出了界限
yaoshun1983 2008-06-12
  • 打赏
  • 举报
回复
非常各位朋友的帮助!
此问题解决了!
第一种办法(我按20楼的办法:在分页事件里面写)
/// <summary>
/// 防止分页时,索引超出范围
/// </summary>
/// <param name="pageSize">单页显示的项数</param>
void splidPage(int pageSize)
{
for (int i = 0; i < pageSize; i++)
{
//show delPic
Image temDelPic = (Image)Repeater1.Items[i].FindControl("delPic");
if (Request.Cookies["MktMemberCookies_3C"] == null)
{ }
else
{
if (memberID == HttpUtility.UrlDecode(Request.Cookies["MktMemberCookies_3C"]["MemID"]))
{
temDelPic.Visible = true;
}
else
{
temDelPic.Visible = false;
}
}

//show Leave Reply
Label temLblID = (Label)Repeater1.Items[i].FindControl("lblID");
Repeater temRep = (Repeater)Repeater1.Items[i].FindControl("Repeater2");

SqlDataAdapter sdaTem = new SqlDataAdapter("Select LR_UserName,LR_Content From TC_LeaveReply Where LR_LeaveID=" + temLblID.Text + " And LR_ShopID=" + Request.Params["shid"], MyCls.SqlConn);
DataSet dsTem = new DataSet();
sdaTem.Fill(dsTem, "reply");

if (dsTem.Tables["reply"].Rows.Count > 0)
{
temRep.DataSource = dsTem.Tables["reply"];
temRep.DataBind();
}
}
}

int leaveCount()
{
int leaveNum;
SqlCommand cmdLeaveCount = new SqlCommand("Select Count(LW_ID) From TC_LeaveWord Where LW_MemberID=" + memberID, MyCls.SqlConn);
leaveNum = (Int32)cmdLeaveCount.ExecuteScalar();
cmdLeaveCount.Dispose();
return leaveNum;
}

protected void btnSubmit_Click(object sender, EventArgs e)
{
SqlCommand cmdSubmit = new SqlCommand("Insert Into TC_LeaveWord(LW_MemberID,LW_Content,LW_UserName,LW_Tel,LW_Email,LW_IP) Values(@LW_MemberID,@LW_Content,@LW_UserName,@LW_Tel,@LW_Email,@LW_IP)", MyCls.SqlConn);
cmdSubmit.Parameters.Add("@LW_MemberID", memberID);
cmdSubmit.Parameters.Add("@LW_Content", txtContent.Text);
cmdSubmit.Parameters.Add("@LW_UserName", txtRealName.Text.Trim() == "请填您的大名" ? "匿名" : txtRealName.Text.Trim());
cmdSubmit.Parameters.Add("@LW_Tel", txtTel.Text.Trim());
cmdSubmit.Parameters.Add("@LW_Email", txtEmail.Text.Trim());
cmdSubmit.Parameters.Add("@LW_IP", Request.UserHostAddress);
try
{
cmdSubmit.ExecuteNonQuery();
Response.Write("<script languge='javascript'>alert('留言成功!');window.location.href='corLeaveWord.aspx?shid=" + sh_id + "'</script>");
Response.End();
}
catch (SqlException ex)
{
Response.Write("留言失败!原因可能是:" + ex.Message);
Response.End();
}
}

protected void lbtnHomePage_Click(object sender, EventArgs e)
{
lblNowPage.Text = "1";
repBind();
if (!pds.IsLastPage)
{
splidPage(pds.PageSize);
}
else
{
splidPage(leaveCount() % pds.PageSize);
}
}

protected void lbtnPreviousPage_Click(object sender, EventArgs e)
{
lblNowPage.Text = Convert.ToString(Convert.ToUInt32(lblNowPage.Text) - 1);
repBind();
if (!pds.IsLastPage)
{
splidPage(pds.PageSize);
}
else
{
splidPage(leaveCount() % pds.PageSize);
}
}
protected void lbtnNextPage_Click(object sender, EventArgs e)
{
lblNowPage.Text = Convert.ToString(Convert.ToUInt32(lblNowPage.Text) + 1);
repBind();
if (!pds.IsLastPage)
{
splidPage(pds.PageSize);
}
else
{
splidPage(leaveCount() % pds.PageSize);
}
}
protected void lbtnEndPage_Click(object sender, EventArgs e)
{
lblNowPage.Text = lblCountPage.Text;
repBind();
if (!pds.IsLastPage)
{
splidPage(pds.PageSize);
}
else
{
splidPage(leaveCount() % pds.PageSize);
}
}

第二种办法(按28楼、31楼方法,不用在分页事件里面写):这个办法真好!

foreach (RepeaterItem item in Repeater1.Items)
{
//show delPic
//Image temDelPic = (Image)Repeater1.Items[i].FindControl("delPic");
Image temDelPic = (Image)item.FindControl("delPic");
if (Request.Cookies["MktMemberCookies_3C"] == null)
{ }
else
{
if (memberID == HttpUtility.UrlDecode(Request.Cookies["MktMemberCookies_3C"]["MemID"]))
{
temDelPic.Visible = true;
}
else
{
temDelPic.Visible = false;
}
}

//show Leave Reply
//Label temLblID = (Label)Repeater1.Items[i].FindControl("lblID");
//Repeater temRep = (Repeater)Repeater1.Items[i].FindControl("Repeater2");
Label temLblID = (Label)item.FindControl("lblID");
Repeater temRep = (Repeater)item.FindControl("Repeater2");

SqlDataAdapter sdaTem = new SqlDataAdapter("Select LR_UserName,LR_Content From TC_LeaveReply Where LR_LeaveID=" + temLblID.Text + " And LR_ShopID=" + Request.Params["shid"], MyCls.SqlConn);
DataSet dsTem = new DataSet();
sdaTem.Fill(dsTem, "reply");

if (dsTem.Tables["reply"].Rows.Count > 0)
{
temRep.DataSource = dsTem.Tables["reply"];
temRep.DataBind();
}
}


第三种解决办法:25楼的方法应该可以解决的,我没亲测试。

谢谢各位!
hailiangcun 2008-06-12
  • 打赏
  • 举报
回复
帮顶
chengqscjh 2008-06-12
  • 打赏
  • 举报
回复
代码明显有问题,你设置repeater只显示10条。i超过10,就会报错
在事件里写
foreach(RepeaterItem item in Repeater_1.Items) {
Image temDelPic = (Image)item.FindControl("delPic");
....
gauzxj 2008-06-12
  • 打赏
  • 举报
回复
调试一下就能知道问题出在那里了!
whb147 2008-06-12
  • 打赏
  • 举报
回复
分页没有处理好边界
Jinglecat 2008-06-12
  • 打赏
  • 举报
回复
直接使用使用 foreach

foreach(RepeaterItem item in Repeater1.Items) {
Image temDelPic = (Image)item.FindControl("delPic");
// ....

}
Jinglecat 2008-06-12
  • 打赏
  • 举报
回复
但留言开始添加到超过10条时,就报错了。

==========

for (int i = 0; i < Repeater1.Items.Count; i++)
行 163: {
行 164: Image temDelPic = (Image)Repeater1.Items[i].FindControl("delPic");
行 165: if (Request.Cookies["MktMemberCookies_3C"] == null)
行 166: { }
一品梅 2008-06-12
  • 打赏
  • 举报
回复
哎,晕了,还是25楼的正解啊.
46539492 2008-06-12
  • 打赏
  • 举报
回复
楼主应该在OnItemDataBound里面这样写,你那样写是错误的,就像17楼说那样

<asp:Repeater ID="Repeater1" runat="server" OnItemDataBound="DataBound">
</asp:Repeater>


protected void DataBound(object sender, RepeaterItemEventArgs e)
{
e.Item.FindControl("delPic");
}
一品梅 2008-06-12
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 only_endure 的回复:]
不要这样写,要在点击分页链接事件里写。
[/Quote]
还有根据当前页码,每页的项数,进行一些运算,根据你的需求来做。
youyuan1980 2008-06-12
  • 打赏
  • 举报
回复
for (int i = 0; i < Repeater1.Items.Rows.Count; i++)
hailiangcun 2008-06-12
  • 打赏
  • 举报
回复
著名.Net培训公司软件工程师培训课程内容(完整课程视频共35G)
第一阶段教学内容安排(200课时)
课程名称 课程内容 培训目的
C# 编程方法和编程技巧、面向对象的思想、数据结构和算法以及设计模式(120课时) 详细介绍.Net Framework、C# 语法、编程方法、编程技巧。深入理解和学习面向对象的思想和方法,学会用面向对象的方法去认识问题、分析问题和解决问题,学习数据结构和常用算法,学习MVC模式、单件模式、适配器模式、工厂模式、观察者模式等设计模式。 深入了解.Net FrameWork、掌握C#语法、编程方法和编程技巧,掌握数据结构、常用算法和面向对象的思想。
针对循环、数组、类的概念、类的构建、类的使用、对象的创建、面向对象的思想、集合、常用算法、IO操作、泛型、反射、委托、迭代器等知识点先后完成如下项目:1。通讯录系统;2。列车售票系统;3。教学管理系统。 通过实际项目深入理解和掌握C# 编程、面向对象的思想、类的概念和使用、对象的创建、算法、IO操作等
数据库知识和 SQL Server 2000 (40课时) 讲授数据库的基本知识和SQL Server 2000, 讲授数据库的设计和优化,学习T-SQL 和数据库编程,学习存储过程(stored procedure)、触发机制(trigger)和索引(index). 掌握 SQL Server 2000, 学会数据库编程, 掌握T-SQL, Stored Procedure, Trigger, index.
C# 高级编程I
(40课时) 系统地讲授多线程的基本概念和使用、线程的设计、线程的优先级;讲授共享程序集(公有程序集)、私有程序集的组成、原理和使用;学习反射(Reflection)、属性(Attribute)的相关概念和使用。学习流(stream)的概念和IO操作、文件的读写和传输。 掌握多线程编程、流的概念、文件的操作和程序集的相关概念,学习反射和属性以及动态定义类型和方法。
第二阶段教学内容安排(400课时)
课程名称 课程内容 培训目的
ASP.Net2.0、ADO.Net2.0和Web 应用程序
(160课时) 系统讲授 ASP.Net2.0、ADO.Net2.0、 基于数据库的WEB应用程序的开发;讲授母版页、Web Part技术、站点导航、数据元对象、Asp.Net缓冲技术、和Asp.Net的安全机制;讲授用户控件和第三方控件的开发和使用;讲授Web Service及其应用和相关的安全性问题、WSE、SOAP、WSDL、UDDI、Windows Service、VSS(Visual Source Safe)。学习HTML、XML、JavaScript、水晶报表(Crystal Report)和IIS 基础以及WEB应用程序性能优化;学习Ajax、Web2.0的相关技术。
熟练掌握基于数据库的Web应用程序和Web服务的开发技术;掌握第三方控件技术和报表技术;掌握Ajax、Web2.0技术;学会操作和处理XML,等等.
针对ASP.Net2.0、ADO.Net2.0、Web服务、HTML、XML、JavaScript、水晶报表(Crystal Report)、Ajax、Web2.0等知识点先后完成如下项目:1。基于Web的远程文件管理系统(Remote File Management System);2。在线咨询系统;3。论坛系统 通过实际项目深入理解和掌握Web开发技术,包括:Asp.Net、Ajax、XML、 Ado.Net、Web Service、Crystal Report 等。

Windows 应用程序、设计模式和Oracle数据库编程(40课时) 系统地讲授Windows应用程序的开发,学习观察者模式和Oracle数据库编程。 熟练开发基于数据库的Windows应用程序,掌握Oracle数据库编程。
C# 高级编程II
(40课时) 详细讲授DNS开发、套接字(Socket)编程、TCP、UDP 编程、消息队列(MSMQ)及其编程;详细讲授远程处理(Remoting)技术,包括基本远程处理框架,配置文件及其应用, 异步远程处理技术,租约和生存期控制;系统地讲授Windows服务编程、Com+ 服务、WSE2.0的使用。进一步讲解进程、线程和应用程序域,讲解多线程的使用、临界区域的概念、序列化、属性和反射技术。深入学习InterNet Access 技术和正则表达式技术。 掌握 Socket 编程、TCP、 UDP编程、远程处理(Remoting)技术、Windows服务编程;Com+ 服务、WSE2.0、InterNet Access和正则表达式技术等。
OOAD¨
(24课时) 讲授面向对象的分析设计方法、UML 语法及Rational Rose/MS Visio 工具的使用 和VSS的使用。 掌握面向对象的建模、分析、设计和实施方法.学习UML 建模语言和 Rational Rose /MS Visio 建模工具.
项目实习
(120课时) 在培训老师的指导下完成如下项目:
(1) 基于套接字(Socket)的 C/S 结构的在线咨询系统。
(2) 基于Windows Form和正则表达式技术的职位搜索器。
(3) 电子商务软件项目:” Prepaid Phone Card Online Sales System”。内容包括:Application Architecture Analysis、Creating the Data Model、Design Database Schema、Programming Stored procedures、Web Application Design、App Setting、 Log in Design、 Security、 Authentication、Authorization、 Navigation Bar、Shopping Cart、Cross-Brower Support、Performance.
通过实际项目, 培养学生实战能力,包括系统分析、设计(包括功能需求分析、数据库设计、功能模块设计和详细设计)、开发、调试、测试和部署的能力。

需要这个培训视频的朋友请联系 QQ 9 3 6 6 5 2 1 1 4
zsxghost 2008-06-12
  • 打赏
  • 举报
回复
 Image temDelPic = (Image)(Repeater1.Items[i].FindControl("delPic"));
一品梅 2008-06-12
  • 打赏
  • 举报
回复
不要这样写,要在点击分页链接事件里写。
guying999 2008-06-12
  • 打赏
  • 举报
回复
代码明显有问题,你设置repeater只显示10条。而你的SQL语句选出来的数据却是全部的,dsLeave.Tables["leave"].Rows.Count的值是数据库中记录的条数。所以i肯定会超过10,
所以Image temDelPic = (Image)Repeater1.Items[i].FindControl("delPic");这个i就会比9大,比9大索引当然就超出范围了。
加载更多回复(18)

62,268

社区成员

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

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

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

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