У меня есть база данных, содержащая две таблицы, продукты и Лицензии. Licences.ProductID
имеет ссылку внешнего ключа на Products.ProductID
(т.е. лицензии на тот продукт).
Как я представляю те отношения в WinForms DataGridView?
При питании DataGridView (Металл SQL и через LINQ к SQL), ProductLicences. ProductID, это автоматически генерирует столбец с текстовым полем, ожидая "продукт" (который, конечно, я не могу ввести...).
Как я изменяю этот столбец для содержания поля комбинированного списка, перечисляющего доступные продукты?
У меня есть соединение (наследовался Linq.DataContext
), источник данных, присвоенный DataGridView, является a Link.IQueryable
, сгенерированный как таковой:
var ds = from c in m_connection.Licences
select c;
В данном случае поведение, которое вы пытаетесь имитировать, это Lookup Combo. Вы не хотите использовать поле 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
. Но не стоит беспокоиться об этом, если вам не нужно использовать класс сущности вне грида.