Ответ 1
В только что созданной строке есть 0 ячеек, поэтому вы получаете это исключение. Вы не можете использовать такие выражения, как
row.Cells[0].Value = i.ToString();
если вы вручную не добавите ячейки в пустую строку.
Я пытаюсь запустить этот код, и получаю исключение:
Индекс оказался вне допустимого диапазона. Должно быть неотрицательным и меньше, чем размер Коллекция. Имя параметра: индекс
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, и теперь я хотел бы заполнить поля, используя этот небольшой метод.
В только что созданной строке есть 0 ячеек, поэтому вы получаете это исключение. Вы не можете использовать такие выражения, как
row.Cells[0].Value = i.ToString();
если вы вручную не добавите ячейки в пустую строку.
Вам просто не хватает одной строки: -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);
Прост,
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 для столбцов и их имен отдельно.
Моя версия:
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++;
};
Спасибо за ваши ответы.
Простая версия:
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);
}
}
Обратите внимание, что не работает, пока количество столбцов в не указано:
myDataGridView.ColumnCount = N.... myDataGridView.Rows.Add(items_0, items_1,... itemsN-1)