1. Построение приложений с привязанными данными в Windows Forms

Поддержка отложенной инициализации при помощи ISupportlnitialize

он несколько схож с интерфейсом

На данном этапе вам нужно еще реализовать интерфейс ISupportlnitialize, Определенный в пространстве имен System.ComponentModel. Этот интерфейс, обсуждавшийся в главе 7, позволяет отложить некоторые шаги инициализации, пока не будут инициализированы все взаимосвязанные свойства вашего элемента управления, устанавливаемые в конструкторе, после чего они вступают в силу одновременно. Он несколько схож с интерфейсом IDisposable В том, что когда вы создаете класс, содержащий уничтожаемые объекты, вы должны сделать сам класс уничтожаемым и делегировать вызовы его метода Dispose Инкапсулированным объектам. Если ваш элемент управления содержит объекты, которые могут инициализироваться, вы должны сделать его инициализируемым и делегировать инициализацию инкапсулированным объектам. Для этого добавьте к вашему определению класса интерфейс ISupportlnitialize И предусмотрите в классе реализацию всех методов интерфейса, делегируя их вызовы реализациям источника привязки и сетки: Это позволит вам контролировать порядок инициализации элементов управления, а также даст возможность контролировать при необходимости свою собственную пакетную инициализацию. Я добавил еще в класс булев флаг Reinitializing. Его можно использовать в качестве сигнала для ваших методов, показывающего, что вы находитесь в процессе инициализации, что нам вскоре пригодится. Я решил также сначала завершать инициализацию источника привязки, а затем сетки, что имеет свой смысл: источник данных сетки должен быть инициализирован прежде, чем сетка попытается завершить свой процесс привязки к этому источнику данных размещенный на форме. Конструктор должен создать за вас на форме несколько объектов: экземпляр набора данных с именем CustomersDataSet, Источник привязки с именем CustomersBindingSource И адаптер таблицы с именем CustomersTableAdapter. Он также соответствующим образом подключит их, установит свойства Datasource И DataMember Вашего элемента управления для работы с генерированными объектами данных, и добавит строчку кода в обработчик события Load Формы, чтобы заполнить набор данных при помощи адаптера.

Если вы сейчас запустите приложение, то должны увидеть сетку, заполненную данными.

Метод Fill адаптера данных

сначала он проверяет не открыто

Я вызываю метод Fill Адаптера данных, который выполняет несколько действий. Сначала он проверяет, не открыто ли уже соединение в нижележащем объекте команды. Если нет, метод Fill Откроет соединение. Затем он исполняет запрос к базе данных. После этого адаптер принимает возвращаемые строки, проверяет, существует ли уже в наборе данных DataTable С требуемой схемой, и если нет, создает ее, а затем помещает в нее возвращаемые строки. Если адаптер данных открывал соединение, перед возвратом из вызова метода он закроет его. Если при заполнении набора данных вы не специфицируете имя таблицы, именем экземпляра таблицы данных будет просто Table, и по мере добавления дополнительных таблиц они будут названы Tablet, ТаЫе2 и т. д. Рис. Г. З показывает весь стек, используемый в типичном случае для работы с наборами данных и реляционными хранилищами данных. Обычно запрос или сохраняемая процедура будет возвращать только одну таблицу результатов, но вы могли бы возвратить одним запросом или сохраняемой процедурой сразу несколько таблиц, как показано в листинге Г.4. таблицы результатов, и набор данных заполняется двумя таблицами, одной для Customers и одной для Orders. Свойство TableName Каждой из результирующих таблиц устанавливается затем соответствующей строкой, поскольку в соответствии с соглашением по умолчанию они были бы названы Table и Tablet. Обратите также внимание на другой синтаксис при создании объектов в этом методе. Вместо спецификации различных параметров для каждого из объектов в его конструкторе здесь они передаются через свойства уже после конструирования.

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

в этой главе мы продолжим

В предыдущей главе было представлено введение в привязку данных Windows Forms и сделан краткий обзор компонента BindingSource, обеспечивающего более свободное связывание источников данных с элементами управления. В этой главе мы продолжим изучение вопросов привязки данных и рассмотрим многочисленные примеры привязки элементов управления Windows Forms, что поможет вам справляться даже с самыми сложными сценариями привязки на практике. В данной главе освещаются программные методы работы с компонентом BindingSource. Затем в главе 5 будет показана работа с окном источников данных и конструктором Windows Forms, которые в значительной мере автоматизируют процесс кодирования в типичных сценариях. Компонент BindingSource разрешает ряд каверзных проблем, которые возникали при непосредственной привязке источников данных к элементам управления, что имело место в. NET 1.x. Он образует промежуточный уровень между источником данных и привязанными элементами управления, что упрощает решение ряда задач. Кроме того, он открывает важные точки управления и доступ к нижележащему источнику данных, что избавляет вас от погружения в механизмы привязки данных формы, без чего нельзя было обойтись в прошлом. Источник привязки также дает вам, с точки зрения формы, единый интерфейс для программирования и позволяет сделать большую часть кода формы развязанной от конкретного типа источника данных. Благодаря этому вам не придется приспосабливать свой код к каждому из используемых приложением источников данных, будь то наборы данных, внешние источники, пользовательские рабочие объекты, массивы или что-то еще. Компонент BindingSource предоставляет обширный набор событий, к которым ваш код может подключаться для отклика на изменения в скрытых за ним данных, производимых другими элементами управления или каким-то кодом в вашем приложении. В этой главе мы шаг за шагом изучим все эти возможности.

Начала привязки данных в WinFx

в winfx существует и развитая

Итак, вы познакомились с парой простых программных приложений WinFx, но с данными в них ничего не происходило. В WinFx существует и развитая модель установки привязанных к данным элементов управления. Ее работа несколько отличается от того, что имеет место в Windows

Forms, и рассчитана на достижение большей гибкости и написание меньшего объема кода. Элементы WinFx ориентируются на концепцию контекста привязки данных, который автоматически передается дочерним элементам: из приложения к нижележащим оконным объектам, и далее вниз к дочерним элементам управления. Поэтому когда у вас есть источник данных, который нужно привязать к нескольким элементам управления, возможно, даже в различных окнах, вы можете организовать контекст данных, который позволит вам инициализировать и установить источник данных в одном месте, и будет автоматически передан вниз по каскадам дерева элементов к любым дочерним элементам, которые не устанавливают явным образом собственный контекст. Если вы внимательно прочитали главы этой книги, это должно вам кое-что напоминать. Подход к привязке в WinFx несколько сходен с работой объектов BindingSource В Windows Forms. Они представляют собой своего рода комплексный пункт для данных, к которым может быть привязано несколько элементов управления. Однако есть несколько явных отличий, как в способе объявления и инициализации привязок, так и в механизме их передачи другим элементам. В Windows Forms, чтобы создать ассоциацию между конкретным источником привязки и элементом управления, вы должны явным образом установить в свойстве DataSource Элемента управления ссылку на BindingSource, Либо добавить к коллекции DataBindings Элемента управления соответствующий объект Binding. Затем вы специфицируете еще и путь внутри источника данных к тому компоненту, к которому вы хотите привязаться. В случае привязок WinFx вам нужно только указать желаемый путь внутри контекста данных, а элемент управления автоматически воспримет контекст данных, установленный в его родительском дереве элементов.

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

как и во многих элементах

Элемент управления TextBox Позволяет вам создавать однострочные и многострочные текстовые поля для ввода или отображения. Как и во многих элементах управления, его свойство Text Определяет строку, которая отображается внутри текстового поля. Когда вы помещаете текстовое поле на форму, режимом по умолчанию является однострочное поле. Если вам нужно многострочное, вы изменяете свойство Multiline На True. Через свойство Scrollbars У вас есть контроль над тем, будут ли у вас линейки прокрутки, когда вы находитесь в многострочном режиме. В. NET вам не нужно использовать для текстовых полей различного вида разные элементы управления, как это было в некоторых ранних инструментах разработки и языках. Однако в элементе управления текстового поля вы ограничены простым текстовым содержанием, и если вам нужно разрешить пользователям форматировать текст, который они вводят, то вы можете предоставить им элемент управления RichTextBox. Как и в случае элемента управления CheckBox, Вы можете обрабатывать событие CheckChanged, Чтобы отслеживать изменения выбора радиокнопок, либо просто проверять значение свойства Checked, Когда это потребуется для обработки. Класс RadioButton Является производным от CheckBox, И именно оттуда он получает определение этих свойств. Не совершайте только принципиального греха, используя радиокнопку там, где уместно поле флажка, и наоборот. Радиокнопки предназначены для взаимоисключающих вариантов выбора; флажки — для независимого выбора. Это часто нарушаемый момент в разработке пользовательского интерфейса, о котором вы не должны забывать. Элемент управления RichTextBox Позволяет пользователю вводить и форматировать текст, используя возможности, поддерживаемые спецификацией формата обогащенного текста. Подобно элементу управления TextBox, Строковое содержимое элемента управления доступно через свойство Text. Свойство Rtf Экспонирует содержимое со всеми встроенными кодами форматирования. Если пользователь вставляет в элемент управления форматированный текст из какой-то другой программы, поддерживающей форматирование, например, из Word или из Web-страницы, в тексте внутри элемента управления форматирование сохранится. Если вы хотите, чтобы пользователи имели возможность форматировать текст, который они вводят в элемент управления, то вам нужно будет предусмотреть другие элементы управления или горячие клавиши, которые позволят им исполнять команды форматирования для выбранного в элементе управления текста.