Поле комбинированного списка для внешнего ключа в DataGridView

У меня есть база данных, содержащая две таблицы, продукты и Лицензии. 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;
8
задан David Hall 8 May 2011 в 20:13
поделиться

1 ответ

В данном случае поведение, которое вы пытаетесь имитировать, это Lookup Combo. Вы не хотите использовать поле Product класса License, вы хотите использовать поле ProductID.

Вот краткое пошаговое руководство:

  1. Удалите столбец Product в гриде; оставьте только ProductID.

  2. Измените свойство ProductID колонки ColumnType на DataGridViewComboBoxColumn.

  3. Измените DataSource этого столбца на новый BindingSource с DataSource, установленным на MyProject.Product (вы можете просто следовать указаниям мастера, вероятно, так же, как вы делали это для самой сетки, но используя Product вместо License).

  4. Измените DisplayMember этого столбца на любой текст, который вы хотите показать в комбинированном окне, например, ProductName.

  5. Измените ValueMember на фактический первичный ключ, например ProductID.

  6. Перед заполнением GridView инициализируйте новый productsBindingSource данными о продукте, т.е. productBindingSource.DataSource = context.Products;.

Вот и все. Теперь, когда вы SubmitChanges (при условии, что вы все время держали DataContext открытым), он обновит ProductID правильной ссылкой. Обратите внимание, что он может не обновить ссылку Product на класс, который он сохранил; если вам по какой-либо причине нужно использовать фактическую ссылку на сущность, то вам, возможно, придется сначала вызвать метод DataContext.Refresh. Но не стоит беспокоиться об этом, если вам не нужно использовать класс сущности вне грида.

13
ответ дан 5 December 2019 в 12:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: