Как вручную добавить данные в dataGridView?

Я пытаюсь запустить этот код, и получаю исключение:

Индекс оказался вне допустимого диапазона. Должно быть неотрицательным и меньше, чем размер Коллекция. Имя параметра: индекс

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

Я вручную создал столбцы в datagridview, и теперь я хотел бы заполнить поля, используя этот небольшой метод.

Ответ 1

В только что созданной строке есть 0 ячеек, поэтому вы получаете это исключение. Вы не можете использовать такие выражения, как

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

если вы вручную не добавите ячейки в пустую строку.

Ответ 2

Вам просто не хватает одной строки: -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);

Ответ 3

Прост,

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

Это сработало, когда я настроил свой DGV ранее для будущих столбцов данных через графический интерфейс. Поэтому в вашем случае это будет выглядеть так:

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

Возможно, вам нужно настроить DGV для столбцов и их имен отдельно.

Ответ 4

Моя версия:

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

Спасибо за ваши ответы.

Ответ 5

Простая версия:

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

Мое расширение, которое мне нравится использовать:

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

Ответ 6

Обратите внимание, что не работает, пока количество столбцов в не указано:

myDataGridView.ColumnCount = N.... myDataGridView.Rows.Add(items_0, items_1,... itemsN-1)