Подтвердить что ты не робот

Когда стоит использовать BindingSource?

Я думаю, что я достаточно хорошо понимаю, что делает класс BindingSource, т.е. обеспечивает слой косвенности между источником данных и элементом управления пользовательского интерфейса. Он реализует интерфейс IBindingList и, следовательно, также поддерживает сортировку. И я использовал его достаточно часто, без особых проблем. Но мне интересно, использую ли я его чаще, чем должен. Возможно, пример поможет.

Скажем, у меня есть просто текстовое поле в форме (с использованием WinForms), и я хотел бы привязать это текстовое поле к простому свойству внутри класса, который возвращает строку. Стоит ли использовать BindingSource в этой ситуации?

Теперь скажем, что у меня есть сетка в моей форме, и я хотел бы привязать ее к DataTable. Должен ли я использовать BindingSource сейчас?

В последнем случае я, вероятно, использовал бы not использование BindingSource, как DataTable, из того, что я могу собрать, обеспечивает те же функции, что и сам BindingSource. DataTable будет запускать правильные события при добавлении, удалении и т.д., Чтобы сетка автоматически обновлялась.

Но в первом случае, когда текстовое поле привязано к строке, у меня, вероятно, будет класс, содержащий свойство string, реализующего INotifyPropertyChanged, чтобы он мог запустить событие PropertyChanged при изменении строки. Я бы использовал BindingSource, чтобы он мог прослушивать эти события PropertyChanged, чтобы он мог автоматически обновлять текстовое поле при изменении строки.

Как это звучит до сих пор? Я все еще чувствую, что в моем понимании есть пробел, который мешает мне видеть всю картину. До сих пор это был довольно неопределенный вопрос, поэтому я постараюсь задать некоторые более конкретные вопросы - в идеале ответы будут ссылаться на приведенные выше примеры или что-то подобное...

(1) Стоит ли использовать BindingSource в любом из приведенных выше примеров?

(2) Похоже, что разработчики просто "предполагают", что класс DataTable будет делать правильные вещи, при запуске событий PropertyChanged в нужное время. Как узнать, способен ли источник данных сделать это? Существует ли конкретный интерфейс, который должен реализовать источник данных, чтобы разработчики могли принять это поведение?

(3) Имеет ли значение, к чему привязан Контроль, при рассмотрении вопроса о том, следует ли использовать BindingSource? Или это влияет только на источник данных? Возможно, ответ (и это выглядит достаточно логично): Control должен быть достаточно интеллектуальным, чтобы прослушивать события PropertyChanged, в противном случае требуется BindingSource. Итак, как можно сказать, способен ли Control сделать это? Опять же, есть ли какой-то конкретный интерфейс, который разработчики могут искать, который должен реализовать элемент управления?

Именно эта путаница, которая в прошлом привела ко мне, всегда использовала BindingSource. Но я хотел бы лучше понять, когда использовать его, чтобы я делал это только при необходимости.

4b9b3361

Ответ 1

Привет, у меня также есть путаница в предмете.
Когда я использую datatables, они реализуют все интерфейсы.
Однако я всегда использую bindingsource, чтобы быть уверенным..:)

Есть некоторые аргументы, почему я могу думать о

  • Несколько видов на одном наборе записей. (т.е. 2 сетки с различными порядками/фильтрами сортировки)
  • Фильтрация, Сортировка, не изменяя порядок сортировки самих записей (Фильтр/Сортировка)
  • Возможность отключить привязку в течение некоторого времени по причинам производительности. (когда в таблице есть большие обновления, не слушайте все события IXXChanged)
  • IErrorprovider никогда не работал у меня без источника привязки, однако это может быть моей ошибкой.

Ответ 2

Довольно старый вопрос. Интересно, почему никто не ответил на это до сих пор. Хорошо, я постараюсь поделиться своими впечатлениями.

A BindingSource - это больше, чем просто способ привязки элементов управления к коллекциям. После работы в WinForms уже более десяти лет лучшие функции BindingSource, которые мне больше всего нравятся, включают в себя:

  • Связывание (конечно!)
  • Управление валютой (я займусь этим через секунду)
  • A BindingSource может выступать в качестве источника данных другого BindingSource.

Чтобы полностью оценить эти возможности, я объясню их в контексте DataSet, который на сегодняшний день является наиболее распространенным типом источника данных, используемого в WinForms, особенно в бизнес-приложениях.

Управление валютой сводит концепцию текущей записи. A DataTable представляет собой всего лишь набор из DataRow s, т.е. Нет понятия текущей записи в DataTables. То же самое относится к DataView (на боковой ноте, вы не можете напрямую привязываться к DataTable; при этом она фактически привязывается к свойству DefaultView этого DataTable, который является DataView Вы можете создать свой собственный DataView тоже).

Управление валютами действительно удобно в случае интерфейса мастера/детализированного интерфейса. Итак, скажем, у вас есть ListBox студентов на левой панели (мастер) и несколько текстовых полей, ComboBoxes, CheckBoxes и т.д. На правой панели с сеткой выбранных курсов для студентов (Detail). В DataSet у вас есть две таблицы данных с именем Student и Courses. Для простоты я избегаю gerund (Student_Course) здесь. Таблица Course имеет внешний ключ StudentID. Здесь, как вы настраиваете привязку здесь (обратите внимание, как все перечисленные выше 3 функции используются в настройке ниже):

  • Добавьте два элемента BindingSource в вашу форму с именем bsStudent и bsCourses.
  • Установите DataSource из bsStudent в Student DataTable.
  • Установите DataSource из bsCourses в bsStudent!
  • В свойстве DataMember вы увидите имя отношения, которое существует в DataSet между нашими двумя таблицами. Выберите его!
  • Установите привязку отдельных элементов управления атома к свойствам bsStudent.
  • Установите DataSource сетки курсов bsCourses.

И все готово. Не записывая ни одной строки кода (так сказать), вы успешно создали представление основных деталей. Теперь элемент управления BindingSource позаботится о текущей записи в списке "Студенты" и обновит не только атомные элементы управления (TextBoxes, ComboBoxes и т.д.), Но и сетку курсов, которая автоматически обновит ее содержимое, чтобы отобразить курсы выбранного студента.

Это, мой друг, является роль BindingSource (среди других приятных вещей, таких как сортировка, фильтрация и т.д.), которые мне больше всего нравятся. Без привлечения BindingSource между вашими элементами управления и хранилищем данных у вас не было бы понятия текущей записи и, следовательно, вручную пришлось бы поддерживать синхронизацию всех пользовательских интерфейсов.

Ответ 3

Я также хотел бы добавить, используя BindingSource, вы можете привязываться к бизнес-объекту, который может реализовать событие INotifyPropertyChanged, поэтому, если данные будут изменены (будь то кодом или кодом другого пользователя), ваш пользовательский интерфейс может автоматически отражать обновления,