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

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

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

Элемент управления CheckBox Позволяет пользователям выбирать значения, которые могут быть истинными либо ложными, «да» или «нет», «включено» или «выключено». Элемент управления CheckBox Поддерживает режим с тремя состояниями, где его значением, определяемым его свойством CheckState, Может быть Checked, Unchecked Или Indeterminate. Чтобы использовать этот режим, вы должны установить свойство ThreeState В True. Неопределенное состояние передается затененным квадратиком внутри поля флажка. Поле флажка не подразумевает какой-либо связи между значением элемента управления CheckBox И состоянием или значением другого элемента управления. Элемент управления CheckBox Состоит из собственно поля флажка и текстовой надписи, которая его сопровождает. Вы будете обычно использовать CheckBox, Перетаскивая его на форму, устанавливая его свойство Text И устанавливая свойство Checked В True Либо False, Чтобы указать состояние по умолчанию элемента управления. Вы можете подключить обработчик для события CheckChanged, Чтобы отслеживать моменты, когда состояние элемента управления изменяется, либо просто проверять значение свойства Checked, Когда потребуется, чтобы принять решение относительно другой обработки в вашем коде. Либо, если вам нужно поле флажка с трем состояниями, вы можете установить в True Свойство ThreeState И установить в свойстве CheckState Одно из трех перечислимых значений: Checked, Unchecked Или Indeterminate.

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

Код обработчика для события Selected lndex Changed

когда страница передается обратно в

Код обработчика для события SelectedlndexChanged Из третьей ячейки текущего выбранного элемента, которым является строка в сетке, и показывает его, устанавливая свойство Text Элемента управления Label На странице. Когда страница передается обратно в браузер, метка покажет выбранного заказчика, а выбранная строка будет отображена в сетке иначе, как определяется собственным кодом форматирования и отображения сетки. Заметьте, что когда происходит отсылка, в процессе обработки все равно вызывается обработчик события Page Load, Ко код привязки к данным в этом методе исполняться не будет, поскольку свойство IsPostBack Для страницы будет истинным. Сетка все еще будет отображать ранее полученные данные таблицы, так как по умолчанию DataGrid Несет все данные в Viewstate Для страницы, так что последняя может перерисовать сетку по этим данным, которые возвращаются на сервер с параметрами отправления для страницы. В действительности Viewstate Является просто скрытым полем ввода, передаваемым на страницу, которое содержит закодированные по схеме Base64 данные для находящихся на ней элементов управления. Использование Viewstate Может значительно снижать производительность, так что, если вы хотите избежать передачи туда и обратно всех данных в Viewstate, Вы можете отключить ViewState Для сетки, но тогда вам придется при каждой отсылке вновь запрашивать данные или получать их из кэша на стороне сервера.

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

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

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