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

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

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

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

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

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