Каскадные поля со списком в Windows Form DataGridView

Я застрял в проблеме, с которой обычно даже не сталкивался бы, но в этом случае это кажется большим делом.

Прежде всего, чтобы избежать путаницы, хотя я уже написал это в заголовке, мы говорим о Windows Forms (не о WPF и не о веб-приложениях).

У меня есть DataGridView, источник данных которого поступает из свойства навигации объекта (entity Framework 5, Code First).

Эта сетка данных имеет, среди прочего, поля «IdEquipment» и «IdConfiguration». Оба столбца имеют тип DataGridViewComboBoxEditingControl. IdEquipment заполняется элементом управления BindingSource, который «Оборудование»:

 _context.Equipments.Local.ToBindingList();

Таблица «Конфигурация» в качестве внешнего ключа «IdEquipment» и поле со списком должны быть подмножеством этой таблицы в каждой строке сетки данных. Для этого после нескольких неудачных тестов и поиска здесь, в SO и где-то еще, я нашел это решение с особым акцентом на dataGridView1_EditingControlShowing и dataGridView1_CellValueChanged.

Кажется, это правильное направление, однако проблема заключается в том, что когда я фильтрую источник данных поля со списком IdEquipment (это также еще один элемент управления BindingSource, привязанный к _context.Configurations.Local.ToBindingList();.

Я где-то читал, что, поскольку я работаю с сущностями, я должен вызывать .ToList(), а не .ToBindingList(), но даже в этом случае фильтрации не происходит (и в любом случае я думаю, что BindingList все еще в порядке).

Другой вариант, который я мог бы использовать, — воспользоваться выбранным значением/объектом первого поля со списком и получить свойство навигации Equipment.Configuration, но я понятия не имею, как это сделать с помощью DataGridViewComboBoxEditingControl.

Любая помощь?


person Andrea Sciamanna    schedule 07.03.2013    source источник


Ответы (1)


Пробыв еще несколько часов, я в конце концов нашел решение, которое лучше всего соответствует моим потребностям: хотя я не знаю, является ли это решением.

  • Избавился от всех элементов управления BindingSource, используемых в полях со списком.
  • В событии DataGrid DataBindingComplete: настройте источник данных обоих комбо с нефильтрованным списком и установите свойства DisplayMember и DisplayValue (оба списка имеют первый «нулевой» элемент).
  • В событии DataGrid EditingControlShowing: изменен источник данных второй комбинации с отфильтрованным списком на основе текущего значения IdEquipement (если есть) и сохранен первый нулевой элемент.
  • В событии DataGrid CellValueChanged: если изменен идентификатор столбца IdEquipement, установите значение null для значения столбца, содержащего IdConfiguration.

Это, пока, работает. Я надеялся более простым способом добиться того же результата, но, насколько я вижу, вариантов нет.

person Andrea Sciamanna    schedule 07.03.2013
comment
Я не внимательно изучил то, что вы написали, но это выглядит правильно. В часто задаваемых вопросах DataGridView есть пример того, что вы хотите, - вам стоит проверить, что они рекомендуют, чтобы убедиться, что вы не пропустили ни одного трюка. Вот URL-адрес загрузки: google.co. Великобритания/ - person David Hall; 07.03.2013
comment
Единственная информация о каскадных полях со списком - это точно тот же код, который я связал в своем вопросе, и который вызывает у меня проблемы, поэтому я не понимаю, как это может мне помочь. - person Andrea Sciamanna; 07.03.2013