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 поле.

Вот быстрый шаг за шагом:

  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 Метод на это в первую очередь. Но не беспокойтесь об этом, если вам не нужно использовать класс сущностей вне сетки.

Другие вопросы по тегам