11

I'm trying to run this code, and I get an exception:

Index was out of range. Must be non-negative and less than the size of the collection. Parameter name: index

private void LoadStudentGrades(int gradeParaleloId, int subjectId)
{
    GradeStudentRepository gradeStudentRepo = new GradeStudentRepository();
    students = gradeStudentRepo.FindAllGradeStudents().Where(g => g.GradeParaleloId == gradeParaleloId)
                .Select(g => g.Student);

    int i = 1;
    foreach (var student in students)
    {
        DataGridViewRow row = new DataGridViewRow();

        row.Cells[0].Value = i.ToString();
        row.Cells[1].Value = student.LastNameFather + " " + student.LastNameMother + ", " + student.Name;

        dataGridView1.Rows.Add(row);
        i++;
    }
}

I manually created the columns in the datagridview, and now I would like to populate the fields using this small method.

2
  • 1
    Are you sure there are columns available for datagridview1 ?
    – V4Vendetta
    Commented May 23, 2011 at 6:07
  • 1
    What do you mean - "I manually created the columns in the datagridview"? Do you mean you defined columns in the "Columns" property sheet of the DataGridView instance placed on a form, or do you mean you defined columns using C# code elsewhere? Commented Dec 7, 2014 at 19:35

5 Answers 5

31

You are just missing one line :-P

DataGridViewRow row = new DataGridViewRow();
row.CreateCells(dataGridView1);  // this line was missing
row.Cells[0].Value = "Cell1";
row.Cells[1].Value = "Cell2";
dataGridView1.Rows.Add(row);
1
  • 2
    This answer relies on the programmer having defined columns in the DataGridView instance on a form (called 'dataGridView1'). The call to the CreateCells method relies on this definition to setup the new row's columns. For people seeking an entirely programmatic way of defining a DataGridView, you first need to define the columns. See SO @ stackoverflow.com/questions/5524075/… Commented Dec 7, 2014 at 20:51
7

Its simple,

myDataGridView.Rows.Add(value1, value2, value3...);

It worked when I had configured my DGV previously for the coming data columns through the GUI. So in your case, it would be like:

private void LoadStudentGrades(int gradeParaleloId, int subjectId)
{
    GradeStudentRepository gradeStudentRepo = new GradeStudentRepository();
    students = gradeStudentRepo.FindAllGradeStudents().Where(g => g.GradeParaleloId == gradeParaleloId).Select(g => g.Student);

    int i = 1;
    foreach (var student in students)
    {
        dataGridView1.Rows.Add(i.ToString(), student.LastNameFather + " " + student.LastNameMother + ", " + student.Name);
        i++;
    }
}

May be you have to configure the DGV for the columns and their names separately.

3

There are 0 cells in the newly created row, that's why you are getting that exception. You cannot use statements like

row.Cells[0].Value = i.ToString();

unless you manually add cells to the blank row.

2

My version of this:

                OracleCommand cmd = new OracleCommand(commandText, _oraConn);
                OracleDataReader dr = cmd.ExecuteReader();

                int i = 0;
                while (dr.Read())
                {
                    DataGridViewRow row = new DataGridViewRow();
                    row.CreateCells(dataGridView1);


                    row.Cells[0].Value = dr.GetValue(0).ToString();
                    row.Cells[1].Value = dr.GetValue(1).ToString();
                    row.Cells[2].Value = dr.GetValue(2).ToString();
                    row.Cells[3].Value = dr.GetValue(3).ToString();
                    row.Cells[4].Value = dr.GetValue(4).ToString();
                    row.Cells[5].Value = dr.GetValue(5).ToString();

                    dataGridView1.Rows.Add(row);

                    //MessageBox.Show( dr.GetValue("vz_id").ToString());
                    i++;
                };

Thanks for your answers.

1

Simple version:

dataGridView1.Rows.Add(new object[] { cell0Value, cell1Value });

My extension that I like to use:

static class DataGridViewExtension
{
    public static void AddCustomRow(this DataGridView dgv, object [] values, object tag = null)
    {
        int Index = dgv.Rows.Add(values);

        // Add a tag if one has been specified
        if (tag != null)
        {
            DataGridViewRow row = dgv.Rows[Index];
            row.Tag = tag;
        }
    }

    public static void AddCustomRow(this DataGridView dgv, string text, object tag = null)
    {
        AddCustomRow(dgv, new object[] { text }, tag);
    }
}

Not the answer you're looking for? Browse other questions tagged or ask your own question.