Какой был бы предпочтительный способ выбора данных для отображения в DataGridView?

#c# #winforms #datagridview

#c# #winforms #datagridview

Вопрос:

Вот мой код:

 private void LoadStudents()
{
    Int64 gradeInstanceId = Convert.ToInt64(cmbGradeInstance.SelectedValue);

    StudentInstanceRepository studentInstanceRepo = new StudentInstanceRepository();
    var studentInstances = studentInstanceRepo.FindAll()
                    .Where(s => s.GradeInstanceId == gradeInstanceId);

    StudentRepository studentRepo = new StudentRepository();
    List<Student> students = new List<Student>();

    foreach (var item in studentInstances)
    {
        students.Add(studentRepo.FindStudent(item.StudentId));
    }

    dataGridView1.DataSource = students;
}
  

Когда я устанавливаю источник данных непосредственно для students, отображаются все столбцы в таблице. Мне нужно только показать, например, Name и LastName, оба являются атрибутами в классе Student.

Как бы я это отобразил? Спасибо!


Редактировать:

Раньше это работало в предыдущей версии формы:

 dataGridView1.DataSource = studentRepo.FindAll()
                          .Where(s => s.GradeParaleloId == gradeID)
                          .Select(s => new { Codigo = s.StudentId, RUDE = s.Rude, Nombre = s.Name   " "   s.LastNameFather   " "   s.LastNameMother, Telefono = s.Telephone });
  

Метод FindAll() был просто возвратом для IQueryable.

Почему это работало раньше, а этот новый код нет?

Комментарии:

1. Почему вы снова находите students после того, как уже получили studentInstances? Почему этот цикл? foreach (элемент var в studentInstances) { студенты. Добавить(studentRepo.FindStudent(item. StudentID)); }

2. Из-за способа проектирования базы данных. Есть таблица student, которая содержит «каталог» видов всех студентов. Затем есть таблица StudentInstance, которая представляет собой просто таблицу внешнего ключа, содержащую StudentID и Year . Это делается для того, чтобы я мог легко получить оценки StudentX, например, за 2009 год.

3. Хорошо.. Просто проверьте трассировку / журнал сервера БД на предмет того, сколько запросов выдается. Я бы предложил использовать что-то вроде предложения contains с studentInstances и students, чтобы уменьшить проблемы SQL.

Ответ №1:

Попробуйте это:

 dataGridView1.DataSource = students.Select(a=> new{a.Name, a.LastName}).ToList(); 
  

Комментарии:

1. Когда я пытаюсь запустить приложение с помощью этой строки, данные в DataGridView не отображаются. Когда я использую обычный старый «students», он показывает все. выбор, похоже, нарушает его. Есть предложения?

2. Из приведенного фрагмента кода. Я не вижу ничего плохого в предлагаемом изменении….

3. @Cybernate: Я знаю, я тоже не вижу в этом ничего плохого. Тем не менее, он ничего не отображает в DataGridView. Что может быть причиной этой проблемы?

4. Можете ли вы опубликовать код, в котором инициализируется DataGridView и т.д.?

5. @Cybernate: Это просто DataGridView по умолчанию, извлеченный из панели инструментов. Ничего особенного во время инициализации. См. Редактирование, пожалуйста.

Ответ №2:

Хорошо, первая версия вроде как пропустила отметку (предполагая ASP.NET). В WinForms просто щелкните правой кнопкой мыши по сетке и «Редактировать столбцы» и привяжитесь к этому:

dataGridView1.DataSource = из s в studentInstanceRepo.FindAll() где s.GradeInstanceId == gradeInstanceId выбрать новый { s.Name , s.LastName };

Комментарии:

1. Понял, что пропустил это! Однако на данный момент я бы не стал создавать это с помощью WinForms, а код в WPF похож по духу. В WinForms просто выполните «Редактировать столбцы» в designer!

2. Целевые компьютеры, на которых будет запущено это приложение, довольно старые — WPF не подходит.