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

时间:2011-06-13 21:06:12

标签: c#

这里有一个小问题,在C#中从visual studio更新MySql DataGridView。下面的代码包含fillData();填充数据网格的方法。按钮代码中抛出异常错误。该按钮的目的是将已审核的字段从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());
        }
    }
}

4 个答案:

答案 0 :(得分:2)

我猜你的问题就在这里:

.SelectedRows[0]

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

作为旁注,以下表达式:

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

......似乎不必要地复杂。你可以用它替换它吗?

this.dataGridView2.SelectedRows[0]

答案 1 :(得分:2)

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

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

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

答案 2 :(得分:2)

你的问题在于这一行:

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

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

答案 3 :(得分:0)

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

if (e.ColumnIndex == 0 && e.RowIndex >=0)
{
  //condition here
}