Combobox для внешнего ключа в DataGridView - PullRequest
8 голосов
/ 13 февраля 2010

У меня есть база данных, содержащая две таблицы, Продукты и Лицензии. Licences.ProductID имеет ссылку на внешний ключ Products.ProductID (т.е. лицензии на этот продукт).

Как мне представить эти отношения в WinForms DataGridView?

При подаче DataGridView (SQL Metal и через LINQ to SQL), ProductLicences.ProductID, он автоматически генерирует столбец с текстовым полем, ожидая «Продукт» (который, конечно, я не могу ввести ...).

Как изменить этот столбец, чтобы он содержал список со списком доступных продуктов?


У меня есть соединение (наследуется от Linq.DataContext), источником данных, назначенным для DataGridView, является Link.IQueryable, сгенерированный так:

var ds = from c in m_connection.Licences
    select c;

1 Ответ

13 голосов
/ 13 февраля 2010

В этом случае поведение, которое вы пытаетесь имитировать, - это комбинация поиска. Вы не хотите использовать поле Product класса License, вы действительно хотите использовать поле ProductID.

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

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

  2. Измените свойство ColumnType столбца ProductID на 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. Но не беспокойтесь об этом, если вам не нужно использовать класс сущностей вне сетки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...