Как правильно отображать данные на DataGridView

Максим Н
Дата: 12.05.2014 15:09:53
Есть простые DTO классы (например Тех.Паспорт, Автомобиль, Владелец и т.д.), есть ORM (sqlite-net), которая отражает таблицы из реляционной БД на списки объектов этих классов (например список всех автомобилей, у которых владельцы старше 25 лет).
Как правильно заполнить датагрид, если помимо данных основного класса нужны данные справочных классов (отобразить автомобили, их владельцев и их тех. паспорта)?

Т.к. DataSource может принимать IEnumerable, то собрал вот такой LINQ-запрос:

var db = new SQLiteConnection("testdb.db3");
var joinedData = from c in db.Table<Car>().ToList<Car>()
                   join p in db.Table<TehPasport>().ToList<TehPasport>() on c.vin equals p.vin
                   join o in db.Table<Owner>().ToList<Owner>() on o.vin equals c.vin
                   select new { c.Vin, p.Number, o.FirstName };
BindingSource bindingSource1 = new BindingSource();
bindingSource1.DataSource = joinedData;
dataGridView1.DataSource = bindingSource1;


Вроде все устраивает, но тогда отпадает дизайнер таблицы, т.е. я не могу нарисовать колонки, наименовать их, расставить обработчики, сортировку и т.д. Только рантайм. Или нет?

Как вариант могу нарисовать некий производный класс, в котором соберу нужные поля из нескольких классов, который будет соответствовать конкретному DataGrid. Привяжусь к нему в дизайн тайме, а потом отображу свой IEnumerable на этот сводный класс.
Но это решение мне не очень нравится, кода больше, причем дублирующегося.


Подскажите как обычно поступают в таких случаях?
petalvik
Дата: 12.05.2014 15:33:50
Максим Н,

ну как бы да, сам собой напрашивается вариант создать производный класс со всеми необходимыми свойствами.

Однако, я вот на что обратил внимание. В коде используются ToList. Зачем? Ведь в таком случае все таблицы целиком будут загружены из БД и лишь затем, уже на клиенте, произойдёт фильтрация по equals.
Имхо, ToList либо совсем не нужен, либо достаточно одного, применённого к результату запроса, уже после объединения.
Cat2
Дата: 13.05.2014 00:00:52
petalvik
ну как бы да, сам собой напрашивается вариант создать производный класс со всеми необходимыми свойствами.

+1
Вместо
var joinedData =

List<MyClass> joinedData =
Cat2
Дата: 13.05.2014 00:03:05
Ах да.
bindingSource1 надо определить в дизайнере
Максим Н
Дата: 14.05.2014 10:00:18
petalvik
Максим Н,

Однако, я вот на что обратил внимание. В коде используются ToList. Зачем? Ведь в таком случае все таблицы целиком будут загружены из БД и лишь затем, уже на клиенте, произойдёт фильтрация по equals.
Имхо, ToList либо совсем не нужен, либо достаточно одного, применённого к результату запроса, уже после объединения.


ToList не нужен, это пример на скорую руку был.
Максим Н
Дата: 14.05.2014 10:00:55
petalvik, Cat2,

Спасибо, пока сделал с производным классом.