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

时间:2013-04-26 10:42:28

标签: c# asp.net

当我销毁并创建数据表

时,我收到以下错误
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也用于解决方案,但它没有帮助。

4 个答案:

答案 0 :(得分:0)

您似乎正在尝试引用位​​置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");
}

答案 1 :(得分:0)

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;
}

答案 2 :(得分:0)

我建议您按索引而不是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");

答案 3 :(得分:0)

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

int index = Convert.ToInt32(e.CommandArgument);
 int i = index%20;
//这里20是我的GridView的页面大小。
 GridViewRow row = gvMainGrid.Rows [i];
 int id = Convert.ToInt32(gvMainGrid.DataKeys [i] .Value);

 new GetData()。DeleteRecord(id);
 GridView1.DataSource = RefreshGrid();
 GridView1.DataBind();

希望这能回答这个问题。