4. Привязка объектов контроля к источникам данных

Поддержка редактирования в привязанном к данным специальном элементе управления

большинство привязанных к данным элементов

Представление данных фактически является односторонней привязкой данных — от источника данных к экрану. Большинство привязанных к данным элементов управления Windows Forms поддерживают некоторую форму двусторонней привязки, позволяя пользователю модифицировать значения в элементе управления, что непосредственно изменяет значения в нижележащей коллекции данных. Есть несколько различных уровней, к которым это может относиться. Как вы помните из главы 7, в интерфейсе IList Есть свойство IsReadOnly, Которое возвращает True, Если потребитель списка не должен его модифицировать. Смысл IsReadOnly Можно интерпретировать по-разному, поэтому интерфейс IBindingList Уточняет его, вводя свойства AllowEdit, AllowNew И AllowRemove, Чтобы явно указать, допускает ли коллекция соответственно редактирование отдельных своих элементов, добавление элементов или удаление элементов. Если вы хотите разработать элемент управления, допускающий редактирование представленных значений, вам потребуется использовать эти интерфейсы, чтобы решить, следует ли пытаться редактировать коллекцию, представленную вашим источником данных, и какого рода модификации вы должны разрешить. В качестве простого примера давайте внесем некоторые дополнения в BarChartControl И DataBoundBarChartControl, Чтобы позволить пользователям редактировать представленные значения в довольно грубой форме. А именно, конечный пользователь может щелкнуть не столбике левой кнопкой, чтобы увеличить его значение на 10 процентов, или правой кнопкой, чтобы уменьшить его на 10 процентов. Элемент управления будет разрешать эти операции только в том случае, если коллекция допускает редактирование, а если она реализует интерфейс IBindingList, То сообщает конкретно, что допускает редактирование содержащихся в ней значений.

Первым шагом для реализации этих функций будет модификация BarChartControl, Обеспечивающая описанную выше форму редактирования. Для этого потребуется добавить свойство, в зависимости от данных указывающее, будет ли созданный из них столбик редактируемым, и обработчик события, обнаруживающий и реагирующий на щелчки мышью, если элемент управления находится в редактируемом режиме. Требуется также способ передачи изменившихся значений обратно к инкапсулирующему элементу управления, который будет отвечать за их сброс в нижележащую коллекцию данных.

Загрузка наборов данных из базы данных

однако в подавляющем большинстве случаев

Вы можете иногда загружать данные в набор данных из XML-файла, который был кэширован на машине клиента, и вам даже, может быть, придется программно создавать набор данных, как было показано в предыдущем разделе. Однако в подавляющем большинстве случаев вы будете применять наборы данных в сочетании с некоторой формой реляционного хранилища данных. В этих случаях вы будете либо загружать данные в набор данных при помощи одного из представленных выше управляемых провайдеров, либо использовать типизированные наборы данных, где схема встроена в тип, а не должна определяться динамически. Я собираюсь сосредоточить внимание на использовании управляемого провайдера SQL Server, поскольку это, вероятно, самая распространенная из баз данных, используемых в приложениях. NET. Если вам требуется использовать провайдеры OLE DB, Oracle или ODBC, модели кодирования останутся практически идентичными благодаря тому, что все они базируются на одних и тех же интерфейсах. Имейте в виду, что управляемый провайдер может использоваться как с полномерным экземпляром SQL Server, так и с экземпляром SQL Server 2005 Express, который является просто редуцированной бесплатной версией машины SQL Server. Я рекомендую вам для создания баз данных на стороне клиента или небольших прикладных баз данных использовать SQL Express, а не базы данных Microsoft Access. Машина SQL Express для приложений клиент-сер — вер гораздо надежнее, и вы можете использовать многие средства машины SQL Server, отсутствующие в Access, такие, как сохраняемые процедуры и триггеры. Вы можете легко установить соединение с базой данных SQL Express, просто специфицировав путь к файлу MDF, который содержит базу данных.

Стилизация элементов управления в WinFx

стили могут также применяться для

Стили позволяют вам декларативно определять, каким будет содержание некоторого элемента WinFx. Стили могут также применяться для динамического изменения содержания элемента во время выполнения. Используя стили, вы можете устанавливать такие свойства, как цвета фона, шрифты и т. п. Но при помощи стилей можно также динамически вводить дочерние элементы в содержание другого элемента. Стиль по существу задает шаблон, который может применяться к элементу управления или к его содержанию.

Стили, подобно контекстам данных, передаются вниз по дереву элементов. И это замечательно, поскольку оказывается, что вам больше не нужно снова и снова применять одно и то же свойство к коллекции элементов управления, чтобы заставить их выглядеть или вести себя одинаково. Вы просто применяете стиль к тому элементу управления, что расположен на более высоком уровне в дереве элементов и в котором «обитают» элементы управления из коллекции, и все они автоматически воспримут этот стиль. Вы можете также явным образом устанавливать для элемента именованный экземпляр стиля, если последний определяет атрибут Key. Возьмем случай элемента управления TextBlock. Допустим, у вас имеется набор из трех элементов управления TextBlock, И вы хотите, чтобы все они имели светло-синий фон и шрифт Comic Sans в 14 пунктов. Вместо того, чтобы устанавливать свойства Font И Background Для каждого из трех этих элементов управления, как это делалось бы в Windows Forms, вы можете просто определить на уровне окна или сетки стиль, который содержит установки стиля для текстовых блоков, и все дочерние элементы управления ниже уровня, определяющего стиль, воспримут любые задаваемые в нем установки свойств и содержание. Вы можете также определить для TextBlock Или другого элемента управления стиль с атрибутом Key, А затем использовать его для явной установки стиля одного или нескольких элементов управления, так что вам не нужно будет устанавливать все необходимые свойства по одному.

Ниже приведен код XAML, который проделывает подобную процедуру для окна с тремя текстовыми блоками в сетке. В нем используется каскадная передача стиля для текстовых блоков от окна к двум элементам управления, а для третьего текстового блока явно устанавливается другой стиль, идентифицируемый ключом.

Метод GetRegions

затем он устанавливает объект соединения

Метод GetRegions Сначала очищает текущее содержимое набора данных, который хранится как элемент-переменная класса, содержащего этот метод. Затем он устанавливает объект соединения и передает его конструктору объекта команды вместе с именем сохраняемой процедуры, которая будет вызваться, всякий раз, когда вы собираетесь вызывать сохраняемую процедуру, вы должны устанавливать свойство CommandType Объекта команды перечислимым значением StoredProcedure. Адаптер настраивается на извлечение первичного ключа перечислимым значением AddwithKey В свойстве MissedSchemaAction, И его свойство SelectCommand Устанавливается на только что созданный объект команды. Наконец, вызывается метод Fill, Который исполнит сохраняемую процедуру, поместив возвращаемый результирующий набор в таблицу с именем Regions В наборе данных. Код в листинге Г.8 показывает метод обновления, который использует набор данных, содержащий таблицу Regions из базы данных Northwind, для выполнения обновлений, если в таблице были сделаны какие-либо вставки, удаления или модификации. Набор данных и адаптер являются здесь элементами охватывающего класса; таким образом, они доступны как для метода, заполняющего набор данных, так и для метода, который производит обновления и возвращает число обновленных строк. Этот код несколько более многословен, чем остальные примеры в этом приложении, поскольку каждая из сохраняемых процедур обновления, вставки и удаления требует некоторых параметров для решения о том, какие действия производить. Давайте разберем его строка за строкой.

Сначала метод извлекает необходимый ему объект соединения из команды выбора, ассоциированной с адаптером данных, который является элементом класса. Затем он создает каждую из команд сохраняемых процедур для обновления, вставки и удаления. Он создает объекты SqlParameter Для инкапсуляции каждого параметра каждой из команд и добавляет их к коллекции Parameters Команды. Затем метод ассоциирует каждую из команд с адаптером данных и вызывает метод Update Адаптера данных, чтобы исполнить команды для каждой строки в наборе данных, которая содержит изменения. Метод Update Адаптера возвращает число строк, которые были вставлены, удалены или обновлены при помощи набора данных. Кроме того, перед возвратом метод снова вызывает Fill Для адаптера данных, чтобы любые параллельные изменения, сделанные в базе данных, или столбцы, вычисляемые триггерами, отразились в кэшированном содержании в наборе данных.

Установка порядка табуляции

элементы управления windows forms следуют

Важным моментом, о котором следует помнить при планировке формы, является правильная установка порядка табуляции элементов управления. Элементы управления Windows Forms следуют стандартному соглашению Windows, позволяя пользователю перемещать фокус ввода от одного элемента управления к другому посредством клавиши Tab. Порядок, в котором будет перемещаться фокус, определяется порядком табуляции. Последний задается свойством Tablndex Каждого элемента управления. Вы можете устанавливать эти свойства вручную, но гораздо проще воспользоваться видом Tab Order конструктора Visual Studio. Если вы выберете Tab Order в меню View, когда в конструкторе отображается форма, вид Design будет модифицирован и отобразит индекс табуляции каждого элемента управления, как показано на

Вы можете установить порядок табуляции в виде Tab Order, щелкая на каждом элементе управления в том порядке, в котором вы хотите установить табуляции, начиная с первого элемента управления. Когда вы дойдете до последнего, автоматически установится новый порядок табуляции. Нажатие Esc или повторный выбор Tab Order в меню View закроет вид Tab Помните, что для меток, описывающих другие элементы управления, как те, что описывают назначение текстовых полей, вы должны устанавливать порядок табуляции, непосредственно предшествующий описываемому элементу управления. Это следует делать потому, что люди с ограниченными возможностями часто используют дополнительные инструменты, помогающие им различать элементы управления для ввода на экране, а многие из этих инструментов полагаются на порядок табуляции. Тогда экранный диктор у пользователя с поврежденным зрением сможет прочитать текст метки, когда он войдет табуляцией в текстовое поле, следующее за меткой по порядку табуляции. Когда пользователь проходит табуляцией по элементам управления, метки пропускаются, поскольку свойство TabStop В базовом классе Control Устанавливается по умолчанию в False. Входные элементы управления, такие, как текстовые поля, переопределяют это свойство, устанавливая его по умолчанию в True, Поэтому они будут принимать фокус ввода, когда пользователь табулирует по элементам управления.