错误:索引超出范围。必须是非负数且小于集合的大小。参数名称:索引

Posted

技术标签:

【中文标题】错误:索引超出范围。必须是非负数且小于集合的大小。参数名称:索引【英文标题】:Error: Index was out of range. Must be non-negative and less than the size of the collection. Parameter name: index 【发布时间】:2013-04-20 12:19:43 【问题描述】:

我在销毁和创建数据表时收到以下错误

RadioButton rdb2 = new RadioButton();
RadioButton rdb3 = new RadioButton();
rdb1 = (RadioButton)DataList1.Items[item.Id].FindControl("One");
rdb2 = (RadioButton)DataList1.Items[item.Id].FindControl("Three");
rdb3 = (RadioButton)DataList1.Items[item.Id].FindControl("Seven");

我所做的是基于用户选择,我从数据库中调用数据并将其放入一个新的数据表中,该表用作我的 DataList 的 DataScouce。

请帮我解决这个错误。我也看到了link 的解决方案,但它没有帮助。

【问题讨论】:

item.Id 是什么(它的值)? 你的DataList1 有多少个Item 你在哪里有这段代码来销毁和创建数据表? DataList1 有动态项,取决于编号。我的数据库中存在的项目。 @V4Vendetta 我还没有为销毁和创建数据表编写任何代码。它就像覆盖。如果数据表中有项目,当我点击另一个项目时,它将来到同一个页面,使用新查询调用数据库以再次填充数据表。 【参考方案1】:

看起来您正在尝试引用DataList.Items 中确实存在于位置Item.Id 的项目。

确保DataList.Items 包含元素并且Item.Id 具有有效值(并且不高于DataList.Items 中的元素总数)

假设item.Id 是一个有效整数,您可以检查item.Id 是否小于集合:

RadioButton rdb2 = new RadioButton();

if (item.Id <= DataList.Items.Count()) 
  rdb2 = (RadioButton)DataList1.Items[item.Id].FindControl("Three");

【讨论】:

微软在support.microsoft.com/kb/836874 有一篇关于此的文章,但没有任何解决方案.. @user1126060 - 这不是 ADO.NET/MS 的错误。您正在尝试访问集合中超出范围的元素。 IE。如果我有一个包含 3 个项目(0、1、2)的数组,称为 Darren。我可以通过做得到物品。达伦[0]、达伦[1]、达伦[2]。但是,如果我执行 Darren[100],它将引发异常(因为我的数组有 3 个元素,而当我尝试 100 时,它超出了范围)。 我没有给我的 DataList1 指定任何大小,但我给了分页 - 每页 6 个项目。我的第一个项目类别有五个项目,代码工作正常,但我的第二个项目类别有 9 个项目并显示上述错误。 @user1126060 你的DataList1.Items 确实有大小。您只是试图访问其中超出范围的元素(就像我向您展示的示例一样)。尝试在您的代码上设置断点并检查 DataList1.Items 有多少元素。【参考方案2】:

DataList1.Items[item.Id] 可以为 null,FindControl 也可以返回 null,最好使用as 将其转换为另一种类型。如果不是给定类型,它不会引发异常。但是你需要在使用前检查null。

if((item.Id < 0) || ((DataList1.Items.Count() -1) < item.Id)) return; // assume item.id is index and integer value 

var dlItem = DataList1.Items[item.Id]; 
if(item !=null)
    rdb1 = dlItem.FindControl("One") as RadioButton;
    rdb2 = dlItem.FindControl("Three") as RadioButton;
    rdb3 = dlItem.FindControl("Seven") as RadioButton;

【讨论】:

【参考方案3】:

我建议您通过索引而不是 ID 访问项目。

喜欢

RadioButton rdb2 = new RadioButton();
RadioButton rdb3 = new RadioButton();
rdb1 = (RadioButton)DataList1.Items[CurrentIndex].FindControl("One");
rdb2 = (RadioButton)DataList1.Items[CurrentIndex].FindControl("Three");
rdb3 = (RadioButton)DataList1.Items[CurrentIndex].FindControl("Seven");

【讨论】:

【参考方案4】:

当您在网格视图中启用分页时会导致此错误。如果你想从网格中删除一条记录,那么你必须这样做。

int index = Convert.ToInt32(e.CommandArgument); int i = 索引 % 20; // 这里 20 是我的 GridView 的页面大小。 GridViewRow 行 = gvMainGrid.Rows[i]; int id = Convert.ToInt32(gvMainGrid.DataKeys[i].Value); 新的 GetData().DeleteRecord(id); GridView1.DataSource = RefreshGrid(); GridView1.DataBind();

希望这能回答问题。

【讨论】:

以上是关于错误:索引超出范围。必须是非负数且小于集合的大小。参数名称:索引的主要内容,如果未能解决你的问题,请参考以下文章

指数超出范围。必须是非负数且小于集合的大小。参数名称:索引

指数超出范围。必须是非负数且小于集合的大小。 (参数'索引')'

指数超出范围。必须是非负数且小于集合的大小。参数名称:索引

指数超出范围。必须是非负数且小于集合的大小

错误“索引超出范围。必须为非负数且小于集合的大小。参数名称:索引”

指数超出范围。必须是非负数且小于集合的大小