Вопрос о дизайне: привязка .NET combobox к массиву объектов - PullRequest
2 голосов
/ 31 июля 2011

Я пишу .NET 4.0 WinForms приложение для настройки аппаратного устройства. Для примера предположим, что устройство имеет 10 настроек, которые можно настроить. Устройство также может хранить 5 различных конфигураций. Итак, я создал объект конфигурации, который определяет 10 настроек. В конструкторе моей формы я создаю массив из 5 объектов конфигурации и устанавливаю этот массив в качестве источника данных для комбинированного списка. Пользователь выберет конфигурацию из выпадающего списка (выпадающий список), и настройки для этой конфигурации будут отображены в пользовательском интерфейсе. Когда пользователь выбирает другую конфигурацию через выпадающий список, мне нужно убедиться, что все параметры в пользовательском интерфейсе были обновлены в текущем объекте конфигурации, прежде чем я отобразлю настройки для вновь выбранного объекта конфигурации. В настоящее время я делаю это в обработчике событий SelectedIndexChanged для выпадающего списка. Когда пользователь завершает изменение настроек, он нажимает кнопку, которая записывает все пять конфигураций на аппаратное устройство. Вот в чем проблема. Если, например, они выбирают третью конфигурацию, изменяют некоторые параметры в пользовательском интерфейсе и затем нажимают кнопку записи, параметры, сохраненные в третьем объекте конфигурации, еще не были обновлены, поэтому параметры, отраженные в пользовательском интерфейсе, не будут теми, которые получаются записано на устройство. Я подумал о нескольких способах решения этой проблемы:

  1. В событии Click для кнопки настройки записи я мог бы написать новый код, который будет всегда обновлять данные в соответствующем объекте конфигурации с текущими настройками в интерфейсе пользователя перед записью данных для всех пяти конфигураций на устройство .

  2. В событии Click для кнопки настройки записи я мог бы программно установить значение SelectedIndex для выпадающего списка на его текущее значение, тем самым запустив обработчик события SelectedIndexChange, который заставил бы настройки записываться в объект конфигурации перед тем, как перерисована. Тогда я мог бы записать все конфигурации на устройство.

Я думаю, что любой из них, возможно, сработает, возможно, с самой большой разницей, когда будет писать новый код для # 1, а не запускать существующий обработчик событий, который уже содержит функциональность, которая мне нужна для # 2. Однако чем больше я думаю об этом, тем больше мне интересно, что обычно считается «правильным» способом сделать что-то подобное. У кого-нибудь есть мысли или идеи по этому поводу? Большое спасибо!

Ответы [ 2 ]

1 голос
/ 31 июля 2011

Похоже, вы не используете BindingSource и, возможно, вы выполняете больше работы, чем вам нужно.

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

Для начала, если вы не знакомы с BindingSource, прочитайте об этом.

Вот как это должно быть у васset up:

  • В конструкторе форм создайте новый источник данных из класса конфигурации (тот, который имеет 10 настроек).

  • Добавьте компонент BindingSource в форму.

  • Установите свойство DataSource BindingSource для нового источника данных, который вы только что создали.

  • Установите ComboBox DataSource на BindingSource.

  • Установите ComboBox DisplayMember на соответствующее описательное свойство BindingSource (которое теперь представляет класс настроек).

  • Свяжите свойства Text 10 TextBox с 10 настройками свойств BindingSource.

  • Во время выполнения установите свойство DataSource дляBindingSource для массива, содержащего 5 объектов конфигурации.

На этом этапе у вас есть рабочая привязка данных.Используйте пользовательский интерфейс для внесения изменений в некоторые настройки, и эти изменения будут отражены в источнике данных (вашем массиве).

(Если это не работает или ведет себя странно, возможно, вам придется удалить обработку событий, которую вы в данный момент делаете.) Обратите внимание, что вам не нужно писать ЛЮБОЙ код, чтобы изменения, которые вносит пользователь,записано в ваш источник данных.Это происходит автоматически.Вам просто нужно написать код, чтобы сохранить данные где-нибудь.

По умолчанию каждое изменение настроек будет отражаться в массиве только тогда, когда текстовое поле теряет фокус, а другой элемент управления, имеющий CausesValidation = true, получает фокус.Поэтому, если ваша кнопка «Настройки записи» имеет значение CausesValidation = true (по умолчанию), тогда ваш массив будет содержать все актуальные данные при обработке этого события щелчка.

Если вы предпочитаете, вы можетеиметь любые изменения, внесенные в текстовые поля настроек, немедленно отраженные в источнике данных, изменив UpdateMode привязок на OnPropertyChanged.По умолчанию OnValidation, то есть, пока фокус не переместится на другой элемент управления с CausesValidation = true.

Еще одна вещь, а затем я остановлюсь на данный момент (потому что я знаю, что могу рассказать вам всевы уже знаете):

Подумайте о том, чтобы ваш класс настроек реализовал INotifyPropertyChanged .Затем вы можете обработать событие PropertyChanged для выполнения проверки, когда пользователь вводит изменения.В качестве альтернативы вы можете обрабатывать события Validating на элементах управления.

Если вы уже знаете все вышеперечисленное, то я прошу прощения за неправильное предположение.От вашего вопроса у меня сложилось впечатление, что вы еще не полностью обнаружили привязку данных WinForms.

0 голосов
/ 31 июля 2011

И в ваших ComboBox_SelectIndexChanged, и в WriteButton_Click событиях у меня будет каждый вызов одного и того же UpdateConfiguration метода.Это гарантирует, что новые настройки всегда сохраняются при необходимости.

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