#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 не подходит.