指数超出范围。必须为非负数且小于集合参数 name:index 的大小

Posted

技术标签:

【中文标题】指数超出范围。必须为非负数且小于集合参数 name:index 的大小【英文标题】:Index was out of range. Must be non-negative and less than the size of the collection parameter name:index 【发布时间】:2013-10-03 14:46:31 【问题描述】:

我正在尝试将数据逐行添加到 datagridview 这是我的代码,它说:

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

这是什么意思?我的代码有什么问题?

String Sqlstr2 = "select ItemName from Item where ItemID = '" + tbItemID.Text + "'";
db.DataRead(Sqlstr2);
string ItemName = db.dr["ItemName"].ToString(); 

DataGridView dataGridView1 = new DataGridView();

dataGridView1.Columns[0].Name = "ItemID";
dataGridView1.Columns[1].Name = "ItemName";
dataGridView1.Columns[2].Name = "Qty";
dataGridView1.Columns[3].Name = "UnitPrice";
dataGridView1.Columns[4].Name = "Amount";

string firstColum = tbItemID.Text;
string secondColum = ItemName;
string thirdColum = tbQuantity.Text;
string fourthColum = Convert.ToString(UnitPrice);
string fifthColum = Convert.ToString(sum);

string[] row = new string[] firstColum, secondColum, thirdColum, fourthColum, fifthColum ;
dataGridView1.Rows.Add(row);

【问题讨论】:

只要一个简单的dataGridView.Columns.Length(或类似的东西)就会告诉你它实际上有多少列。 【参考方案1】:

错误提示“索引超出范围”。这意味着您正在尝试使用无效值来索引对象。如果你有两本书,我要求你给我第三本书,你会觉得我很有趣。这是电脑看着你很有趣。你说 - “创建一个集合”。所以它做到了。但最初收藏是空的:它不仅没有任何东西 - 它没有空间容纳任何东西。 “它没有手”。

然后你说“集合的第一个元素现在是'ItemID'”。电脑说“我从来没有被要求为'第一个项目'创造空间。”我没有手握住你给我的这个东西。

就您的代码而言,您创建了一个视图,但从未指定大小。你需要一个

dataGridView1.ColumnCount = 5;

在尝试访问任何列之前。修改

DataGridView dataGridView1 = new DataGridView();

dataGridView1.Columns[0].Name = "ItemID";

DataGridView dataGridView1 = new DataGridView();
dataGridView1.ColumnCount = 5;
dataGridView1.Columns[0].Name = "ItemID";

见http://msdn.microsoft.com/en-us/library/system.windows.forms.datagridview.columncount.aspx

【讨论】:

不客气。我觉得这与您接受的答案相同,尽管我是独立提出的(而且,我可能会先补充一下。:-)) 嗨弗洛里斯。我在“dataGridView1.ColumnCount = 2;”处收到此错误“无法在数据绑定 datagridview 控件 c# 上设置列计数属性”请帮我解决这个问题。 @Sanjeev4evr - 您的错误消息向我表明,如果无法设置该属性,则它一定是由其他东西定义的。也许“数据绑定数据网格视图”的列数由数据固定。如果你把那条线去掉,它会起作用吗? 当我删除该行时,它抛出了相同的异常“索引超出范围。必须是非负数并且小于集合的大小。参数名称:索引” 是的。感谢您回顾我的问题。你可以在其他时间帮助我。【参考方案2】:

您没有将列添加到您的 DataGridView

DataGridView dataGridView1 = new DataGridView();//Create new grid

dataGridView1.Columns[0].Name = "ItemID";// refer to column which is not there 

现在是否清楚为什么会出现异常?

在使用列修复错误之前添加此行

dataGridView1.ColumnCount = 5;

【讨论】:

非常感谢您的回答,但是在运行程序时,从文本框和变量中获取的数据仍然无法在 datagridview 中查看,您能帮帮我吗? 发布为新问题,您一定会得到帮助【参考方案3】:

这是什么意思?我的代码有什么问题吗

这意味着您正在访问集合中不存在的位置或索引。

要找到这个,请确保您的 Gridview 有 5 列,因为您在此行使用它的第 5 列

dataGridView1.Columns[4].Name = "Amount";

这是显示数组元素的图像。因此,如果您的 gridview 的列少于您访问它的 (index + 1),则会出现此异常。

【讨论】:

【参考方案4】:

dataGridView1.Columns 的长度可能小于 5。然后访问 dataGridView1.Columns[4] 将不在列表之外。

【讨论】:

非常感谢您的回答【参考方案5】:

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

int index = Convert.ToInt32(e.CommandArgument);
int i = index % 20;
// Here 20 is my GridView's Page Size.
GridViewRow row = gvMainGrid.Rows[i];
int id = Convert.ToInt32(gvMainGrid.DataKeys[i].Value);
new GetData().DeleteRecord(id);
GridView1.DataSource = RefreshGrid();
GridView1.DataBind();

希望这能回答问题。

【讨论】:

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

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

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

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

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

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

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