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

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

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 Для каждой строки анализируемых данных. В этом примере я создал его как пользовательский элемент управления, чтобы он автоматически отображал полосу прокрутки на тот случай, когда данных оказывается больше, чем позволяет представить размер элемента управления.

Действительная фильтрация

все что требуется сделать в

Для действительной фильтрации воспользуйтесь встроенными возможностями самого компонента BindingSource, Который сделает за вас всю грязную работу. Все, что требуется сделать в обработчике события Click Кнопки — это указать критерий фильтрации, который должен быть допустимым выражением для свойства Filter. Поддерживаемые компонентом BindingSource Выражения фильтра проще тех, что используются свойством DataColumn.Expression; Здесь у вас нет различных ограничителей для различных типов данных. Вы просто заключаете значение фильтруемого свойства или поля в одиночные кавычки, что годится также для численных типов и для дат. Однако нижележащий источник данных не обязан поддерживать фильтрацию; это означало бы, что он должен поддерживать интерфейс IBindingListView . Прежде всего метод фильтрации убеждается, что для работы имеются наличные данные; если нет, он возвращает управление. Далее, если для фильтра введено пустое выражение, это должно расцениваться как очистка выражения фильтра, поэтому код проверяет, не пусто ли текстовое поле, и если пусто, устанавливает свойство Filter Источника привязки в Null. Обратите внимание на вызов String.IsNullOrEmpty. Это новый метод класса строк, введенный в. NET 2.0, и он избавляет от необходимости писать длинный условный оператор, проверяющий оба варианта — пустую строку или нулевую строку, что очень часто приходится делать в коде, работающем со строками. В данном случае такой необходимости по существу нет, поскольку элемент управления TextBox, Если он пуст, всегда возвращает пустую строку.

После этого код забирает имя столбца из комбинированного поля и строку фильтра из текстового поля, используя их для конструирования выражения фильтра при помощи метода String.Format, И устанавливает его в качестве свойства Filter Источника привязки. Когда все это сделано, вы получаете возможность во время выполнения ввести в текстовое поле значения для фильтра, в чем вам будет помогать функция автозавершения, а затем настроить сетку на отображение соответствующих значений, щелкнув на кнопке Filter.

Элемент управления SplitContainer

использование элемента управления b splitter

Наконец, элемент управления SplitContainer Является заменой известного элемента управления Splitter, Входившего в. NET 1.0 и 1.1. Использование элемента управления Splitter Было весьма неочевидным, поскольку было основано на z-порядке элементов управления в коллекции. По соображениям обратной совместимости элемент управления Splitter Все еще доступен, но SplitContainer Гораздо проще и понятнее в использовании. Он предусматривает полоску разделителя и две панели по обе стороны от нее, которые могут служить в качестве контейнерных элементов управления для всего, что вы поместите по ту или другую сторону разделителя. Это улучшает поведение формы как во время проектирования, так и во время выполнения при создании интерфейсов с разделенным окном показывают простой образец приложения, которое демонстрирует действие этих трех элементов управления. В этом приложении на форму был добавлен элемент управления SplitContainer, На его левую панель был добавлен контейнер TableLayoutPanel, Состыкованный по центру, а на правую был добавлен контейнер FlowLayoutPanel И также состыкован по центру. В шесть ячеек табличной панели планировки были помещены две метки, два текстовых поля и две радиокнопки. В поточную панель планировки были помещены четыре элемента управления PictureBox. Когда выбирается радиокнопка English или German, метки-подсказки для текстовых полей в табличной панели планировки переключаются на соответствующий язык. В.18 показывает первоначальный вид запущенного приложения, где справа только четвертое изображение переносится в начало второго ряда. Метки в таблице слева примыкают к своим текстовым полям и максимально используют отведенное для них пространство. Когда я изменяю размер формы, делая ее более узкой, и переключаюсь на немецкий язык, вы можете видеть эффект этих действий в двух панелях планировки на рис. В. 19. Более длинный текст немецких подсказок автоматически изменяет размер меток. Табличная панель планировки имеет фиксированную ширину, и для левой панели ее родительского разделенного контейнера установлена фиксированная ширина, поэтому табличная панель планировки изменяет ширину столбца с текстовыми полями, чтобы дать место более длинным меткам.