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

Posted

技术标签:

【中文标题】指数超出范围。必须是非负数且小于集合的大小。参数名称:索引【英文标题】:Index was out of range. Must be non-negative and less than the size of the collection. Parameter name: index 【发布时间】:2011-09-14 05:56:53 【问题描述】:

刚刚在 C# 中从 Visual Studio 更新 mysql DataGridView 时遇到了一个小问题。下面的代码包含 fillData();填充数据网格的方法。按钮代码中抛出异常错误。该按钮的目的是将 Reviewed 字段从 0 替换为 1,这意味着随后选中了已审核的复选框。这可能是一个非常基本的问题,所以我可能会提出更多问题,希望您能提供帮助。

public DataTable tb = new DataTable();
public MySqlDataAdapter a = new MySqlDataAdapter();

public void fillData()

    using (MySqlConnection c = new MySqlConnection("host="";user="";password=""; database="";"))
    
        c.Open();                
        string strSQL = "SELECT DataID, Date, WhichMeal, HbA1C_Test, Carbohydrates, GlucoseReading, InsulinUsed, InsulinType, ReviewedBy, Reviewed From PatientData WHERE username = '" + uname.Text + "';";

        using (MySqlDataAdapter a = new MySqlDataAdapter(strSQL, c))
        
            a.Fill(tb);
            dataGridView2.DataSource = tb;
        


private void button5_Click(object sender, EventArgs e)

    using (MySqlConnection c = new MySqlConnection("host=;user=;password= ""; database=""))
    
        try
        
            string DataId =  dataGridView2.Rows[this.dataGridView2.SelectedRows[0].Index].Cells["DataID"].Value.ToString();
            string Update = string.Format("UPDATE PatientData SET Reviewed = 1 WHERE DataID = 0", DataId);
            MySqlCommand command = new MySqlCommand(Update, c);

            c.Open();
            command.ExecuteNonQuery();
            c.Close();
            tb.Clear();
            fillData();
        
        catch (MySqlException ex)
        
            MessageBox.Show(ex.ToString());
        
    

【问题讨论】:

fillData() 没有足够的右大括号。 【参考方案1】:

您可以通过检查以下内容来找到问题:

有多少条目 this.dataGridView2.SelectedRows? this.dataGridView2.Rows 中有多少条目? this.dataGridView2.SelectedRows[0].Index 的值是多少?

索引值大于其中一个集合中的有效条目数。

【讨论】:

谢谢,我什至没有选择任何行! this.dataGridView2.SelectionMode = DataGridViewSelectionMode.FullRowSelect;【参考方案2】:

我猜你的问题在这里:

.SelectedRows[0]

您能否验证在运行此代码时 .SelectedRows 属性的 Count 是否为 1 或更多?

作为旁注,以下表达式:

dataGridView2.Rows[this.dataGridView2.SelectedRows[0].Index]

... 看起来过于复杂了。可以换成这个吗?

this.dataGridView2.SelectedRows[0]

【讨论】:

@Joe Bell:嗯,你有它。编写您的代码,使其不执行任何操作,除非 SelectedRows.Count > 0,您应该一切顺利。【参考方案3】:

你的问题出在这一行:

string DataId =  dataGridView2.Rows[this.dataGridView2.SelectedRows[0].Index].Cells["DataID"].Value.ToString();

您正在尝试在没有记录的地方插入记录。解决此问题的解决方法是先尝试在行中插入一些虚拟数据,然后用实际数据覆盖它。

【讨论】:

【参考方案4】:

我在处理gridview中的按钮事件时遇到了这种问题..我的解决方案是这样的:

if (e.ColumnIndex == 0 && e.RowIndex >=0)

  //condition here

【讨论】:

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

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

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

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

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

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

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