3. Общее представление о привязке данных в Windows Forms

Синхронизация данных между элементами управления

как мы уже упоминали когда

Давайте взглянем теперь на то, что происходит, когда вы привязываете элемент управления или несколько элементов управления на форме к набору данных. Как мы уже упоминали, когда вы создаете привязки данных, форма сама создает синхронизирующие объекты на тот случай, если некоторые из ваших элементов управления будут привязаны к одному источнику данных и вы хотите, чтобы они были синхронизированы. Сама форма имеет свойство BindingContext, Содержащее коллекцию синхронизирующих объектов для каждого из источников данных, используемых для привязки на этой форме. Как правило, в. NET 2.0 вам нет нужды в своем коде иметь дело непосредственно с контекстом привязки, но иногда, чтобы все заработало, необходимо именно понимание скрытых от вас процессов. . Как говорилось в предыдущем разделе, скрытым образом создаются экземпляры CurrencyManager Для списочных источников данных или PropertyManager Для индивидуальных объектов. Каждый из этих классов производится ОТ BindingManagerBase; В BindingContext СОДержится ссылка на объект именно этого типа. Чаще всего вам придется иметь дело С CurrencyManager. Компонент-контейнер Создает экземпляр CurrencyManager Для каждого списочного источника данных, который вы специфицировали для элемента управления на форме, и добавляет его в контекст привязки формы. CurrencyManager Отслеживает как источник данных, так и привязанные к его данным элементы управления. Вы можете использовать его для доступа к данным, стоящим за элементами управления, определять текущую строку или объект и изменять эту текущую строку, воздействуя тем самым на все привязанные к ней элементы управления. CurrencyManager Уведомляет элементы управления о добавлениях, удалениях и изменениях элементов в привязанной коллекции, а элементы управления могут использовать эти уведомления для своего обновления в соответствии с состоянием источника данных.

Элементарная привязка данных в DataGridView

для этого вам прежде всего

Наилучший способ приступить к изучению элемента управления DataGridView — это использовать его в элементарных сценариях привязки данных. Для этого вам прежде всего нужно получить коллекцию данных, что обычно делается через рабочий уровень или уровень доступа к данным вашего приложения. Затем вы устанавливаете свойства привязки данных сетки, чтобы привязаться к коллекции данных, как было описано в главах 4 и 5. Как и в случае других элементов управления Windows Forms, в. NET 2.0 рекомендуется всегда привязывать действительный источник данных на стороне клиента к объекту BindingSource, А уже к нему привязывать элементы управления. Этот процесс иллюстрируется следующим кодом. В элементарных сценариях привязки данных DataGridView Функционирует точно так же, как элемент управления DataGrid В. NET 1.0, за исключением того, что комбинация свойств DataSource И DataMember Должна определять коллекцию элементов данных, такую, как таблица или коллекция объектов. Говоря точнее, эти свойства должны определять объект, реализующий интерфейс IList. Сетка DataGrid Могла быть привязана к коллекции коллекций, такой, как DataSet, И в этом случае отображала элементы управления иерархической навигации для перемещения по коллекциям данных. Однако такая возможность использовалась редко, отчасти потому, что навигационные элементы управления, отображаемые в сетке, не были интуитивно понятны и могли дезориентировать пользователя. Поэтому группа Windows Client, разрабатывавшая DataGridView, Решила не поддерживать иерархическую навигацию в самом элементе управления. Сетка DataGridView Предназначена для представления одновременно только одной коллекции данных. Вы все равно можете осуществить наглядную иерархическую навигацию в данных, но для этого используется, как правило, более одного элемента управления, с применением подхода «ведущий-детализация», описывавшегося в предыдущих главах.

Иерархическая привязка

net которая отсутствует в windows

Одной из возможностей ASP. NET, которая отсутствует в Windows Forms, является привязка иерархического источника данных, такого, как XML-файл, к иерархическому элементу управления вроде Treeview. Для этого можно воспользоваться элементом XmlDataSource, Нацеленным на XML-файл, и установить его в качестве источника данных для Treeview. Затем вы можете установить в TreeView Связки TreeNodeBinding, Чтобы выбрать из элементов иерархии отдельные поля. Следующий пример будет отображать имя каждого элемента из books. xml в виде узла дерева, и когда будет найден узел с именем Book, Он покажет дочерние элементы, определяемые для каждого узла книги значением атрибута заглавия: Использование параметров Select, Которое было показано ранее, будет более эффективно, если вы не кэшируете данные. Но если данные кэшируются, то вы, возможно, захотите получать таким образом все записи из коллекции и фильтровать их в памяти, избегая двустороннего обмена с базой данных. Имеются дополнительные свойства, которые можно установить в источнике данных, чтобы он кэшировал данные автоматически. Для привязки ведущий-детализация к коллекции объектов посредством ObjectDataSource Вместо SqlDataSource Потребуется метод SelectMethod, Который принимает параметры для ограничения возвращаемого набора результатов, аналогично тому, что делает предложение Where В SQL. Будет ли работать фильтрация, зависит от возможностей возвращаемой коллекции Это приложение очень кратко ввело вас в кодирование сценариев баз данных с использованием ASP. NET 2.0 и дало представление о том, какие здесь имеются возможности и как ими воспользоваться. Не предполагалось, что это будет исчерпывающим уроком по привязке к данным, но оно поможет вам приступить к делу. Эта информация окажется полезной, если вам потребуется кодировать для приложения подобные пользовательские интерфейсы с привязкой к данным, в то время как для некоторой части своих пользователей вы будете также строить версию с Windows Forms.

События верификации DataGridView

элемент управления b datagridview b

Сетка DataGridView — это элемент управления Windows Forms, производный от базового класса Control, Являющийся сложным контейнером данных. Элемент управления DataGridView Позволяет вам управлять верификацией на нескольких уровнях. Сама сетка является элементом управления и, таким образом, возбуждает события Validating И Validated, Когда фокус уходит с сетки. Однако обычно вы захотите управлять верификацией несколько ближе к верифицируемым данным, на уровне либо отдельной строки,, либо отдельной ячейки. На этот случай DataGridView Запускает события RowValidating И RowValidated Всякий раз, когда в сетке сменяется выбранная строка. Аналогичным образом, когда фокус переходит от ячейки к ячейке в сетке, запускаются события CellValidating И CellValidated. Эти события следуют той же модели, что и события верификации элемента управления, позволяя вам отменить верификацию, установив свойство Cancel Аргумента события равным True. В случае события RowValidating Типом аргумента события является DataGridViewCellCancelEventArgs; Для CellValidating Типом аргумента события является DataGridViewCellVali — DatingEventArgs. Оба эти типа дают вам доступ к текущим Rowindex И Columnindex, И они имеют свойство Cancel, Которое можно установить в True Для отмены верификации. Если верификация терпит неудачу, DataGridview Удерживает фокус на текущей ячейке. Как вы можете помнить из прочитанного ранее, всякий раз, когда вы перемещаете фокус в привязанной к данным сетке, для ячейки, которую вы покинули, запускается событие CellParsing, А для ячейки, к которой вы перешли, запускается событие CellFormatting. Что касается верификации, вы должны иметь в виду, что событие CellValidating Запускается до события CellParsing. Поэтому логика верификации, которую вы применяете в обработчике для CellValidating, Должна работать с отображаемым содержанием ячейки, которое не обязательно прямо соответствует сохраняемому содержанию соответствующего компонента данных в источнике данных. Если вы в целях отображения выполняете преобразования или форматирование, и хотите верифицировать данные перед тем, как они будут сброшены обратно в нижележащий источник данных, но после того, как пройдет процесс анализа, вам нужно вызывать эту логику в обработчике события CellParsing, А не в обработчике CellValidating.

Определение специальной структуры данных для отображения

в нашем случае b bindinglist

Данные, используемые элементом управления для отображения столбиков, содержатся в коллекции компонентов данных, созданной из обобщенного типа BindingList<T> . В нашем случае BindingList<T> Используется как контейнер для пар значений в экземплярах объекта ChartPair. Этот объект является простым контейнером для значения и метки, ассоциируемой с каждым столбиком: Этот класс опять же относится к деталям реализации элемента управления, поэтому он также помечается как Internal. Данные, используемые элементом управления, экспонируются через свойство интерфейса IList С именем Data, Так что они доступны для занесения и извлечения инкапсулирующим элементом управления. Имеется несколько других элементов-переменных, здесь не показанных, которые используются для хранения прямоугольников столбика и метки, а также максимальных и минимальных значений, используемых кодом рисования. Элемент управления имеет метод UpdateCoordinates, Вызываемый при необходимости для пересчета координат столбиков и меток в соответствии с данными, и переопределение метода Control .OnPaint, В котором и производится все отображение столбиков по координатам, вычисленным в Upda — TeCoordinates. Повторяю, что если вы захотите посмотреть детали того, как все это делается, обратитесь к загружаемому коду. Он не так уж и сложен; там всего около сотни строк. Как только элемент управления BarChartControl Закодирован и отлажен, вы можете создать привязанный к данным элемент управления, который создает и заполняет экземпляр BarChartControl Для каждой строки анализируемых данных. В этом примере я создал его как пользовательский элемент управления, чтобы он автоматически отображал полосу прокрутки на тот случай, когда данных оказывается больше, чем позволяет представить размер элемента управления.