Combobox для внешнего ключа в DataGridView
У меня есть база данных, содержащая две таблицы, Продукты и Лицензии. Licences.ProductID
имеет ссылку на внешний ключ Products.ProductID
(т.е. лицензии на этот продукт).
Как мне представить эти отношения в WinForms DataGridView?
При подаче DataGridView (SQL Metal и через LINQ to SQL), ProductLicences.ProductID, он автоматически генерирует столбец с текстовым полем, ожидая "Product" (в который я, конечно, не могу войти...).
Как изменить этот столбец, чтобы он содержал список со списком доступных продуктов?
У меня есть связь (наследует от Linq.DataContext
) источник данных, назначенный для DataGridView, является Link.IQueryable
, сгенерированный как таковой:
var ds = from c in m_connection.Licences
select c;
1 ответ
В этом случае поведение, которое вы пытаетесь имитировать, является комбинацией поиска. Вы не хотите использовать Product
поле License
класс, вы на самом деле хотите использовать ProductID
поле.
Вот быстрый шаг за шагом:
Удалить
Product
столбец в сетке; оставить толькоProductID
,Изменить
ProductID
колонкиColumnType
свойство для DataGridViewComboBoxColumn.Изменить этот столбец
DataSource
к новомуBindingSource
сDataSource
установлен вMyProject.Product
(вы можете просто следовать за мастером, вероятно, так же, как вы делали это для самой сетки, но используяProduct
вместоLicense
).Изменить
DisplayMember
из этого столбца в любой текст, который вы хотите показать в поле со списком, например,ProductName
,Изменить
ValueMember
к фактическому первичному ключу, такому какProductID
,Перед заполнением
GridView
сам, инициализируй новыйproductsBindingSource
с данными о продукте, то есть сproductBindingSource.DataSource = context.Products;
,
Вот и все. Теперь, когда ты SubmitChanges
(при условии, что вы сохранили DataContext
открыть все время), он будет обновлять ProductID
с правильной ссылкой. Обратите внимание, что это может не обновить Product
ссылка на класс, который он сохранил; если вам по какой-либо причине необходимо использовать фактическую ссылку на сущность, вам может потребоваться вызвать DataContext.Refresh
Метод на это в первую очередь. Но не беспокойтесь об этом, если вам не нужно использовать класс сущностей вне сетки.