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

Функции сетки ориентированные на ячейку

b отчасти это мотивировано тем

Вы, возможно, заметили, что элемент управления DataGridView В гораздо большей степени ориентирован на уровень ячеек, чем его предшественник DataGrid. Отчасти это мотивировано тем, что часто приходится иметь дело с сетками, структура содержания которых не обязательно диктуется столбцами. В частности, пользователи хотят иметь в своем распоряжении функциональные возможности, имитирующие интерактивную модель электронных таблиц, к которой привыкли миллионы пользователей Microsoft Excel и других подобных приложений. Повторим, что здесь к нам на выручку приходит DataGridView, Делая поддержку такой модели довольно несложной. Вы уже видели некоторые события уровня ячеек, которые позволяют контролировать отображаемое на уровне ячейки , И те, что сообщают о взаимодействии пользователя с ячейкой при редактировании Или просто щелчке на ней . Вы можете устанавливать различные контекстные меню и инструментальные подсказки вплоть до уровня отдельных ячеек, так что каждая из них может представляться самостоятельной логической сущностью. На самом деле сетка DataGridView Может возбуждать более 30 событий, отражающих взаимодействия и модификации на уровне ячейки, на которые вы можете подписываться в целях реализации функций, ориентированных на ячейку.

Кроме того, имеется несколько различных режимов выбора, позволяющих менять то, каким образом сетка выделяет ячейки, столбцы или строки, когда пользователь щелкает кнопкой мыши в различных местах сетки. Свойство SelectionMode Сетки определяет ее поведение при выборе и имеет тип DataGridViewSelectionMode. Элемент управления DataGridView Поддерживает режимы выбора, описанные в таблице 6.6. Хотя эти режимы нельзя комбинировать непосредственно, вы можете осуществить комбинацию режимов, используя свойство SelectionMode Сетки совместно с обработкой событий. Вне зависимости от того, какой из режимов вы установите, щелчок на левой верхней заголовочной ячейке выбирает все ячейки сетки.

Провайдер ошибок

например если вы хотите верифицировать

Обычно вы будете устанавливать в провайдере ошибок сообщение об ошибке в ответ на событие Validating, Обсуждавшееся выше. Например, если вы хотите верифицировать пароль пользователя, когда фокус покидает текстовое поле пароля, то могли бы предусмотреть следующий обработчик для события Validating: Этот обработчик будет вызываться по умолчанию, когда фокус переходит от текстового поля пароля к какому-то другому элементу управления на форме. Прежде всего код проверяет, не пусто ли поле имени пользователя. Если пусто, то для решения относительно пароля нет достаточной информации. Если имя пользователя было введено, код вызывает вспомогательный метод для проверки пароля пользователя. Этот метод мог бы обращаться к базе данных или отыскивать пользователя в каком-то другом хранилище с удостоверениями личности. Если имя пользователя указано и пароль проходит проверку, то сообщение об ошибке в провайдере ошибок для текстового поля пароля устанавливается в Null. В противном случае устанавливается соответствующее сообщение об ошибке. Провайдер ошибок будет показывать рядом с текстовым полем значок уведомления, как показано на рис. 10.3, и будет использовать установленное сообщение об ошибке для всплывающей подсказки является значком по умолчанию, используемым элементом управления, но вы можете настроить изображение значка, установив в свойстве Icon Экземпляр объекта System. Drawing, Icon. Кроме того, по умолчанию значок сначала мигает с периодом 250 миллисекунд, чтобы привлечь внимание пользователя. Эти установки можно легко изменить через свойства BlinkStyle И BlinkRate. Если вы хотите для разных элементов управления на форме предусмотреть различное поведение, вам нужно предусмотреть отдельные экземпляры провайдера ошибок со статически установленными визуальными свойствами, а затем устанавливать сообщения об ошибках для конкретных элементов управления в соответствующих экземплярах провайдера ошибок.

Интерфейс определяет два метода: Beginlnit и Endlnit

конструктор visual studio знает этот

Ни один из них не принимает параметров и ничего не возвращает; это просто сигнальные методы, сообщающие реализующему классу, когда инициализация начинается и когда заканчивается с точки зрения некоторого потребляющего кода. Конструктор Visual Studio знает этот интерфейс и ищет его в любом компоненте или элементе управления, который вы перетаскиваете в рабочее пространство конструктора. Если он видит, что добавленный вами компонент реализует этот интерфейс, то добавляет вызовы Beginlnit И End — Init, Охватывающие в генерируемом конструктором коде установку любых свойств этого компонента. Это гарантирует, что порядок, в котором конструктор устанавливает эти свойства, не будет играть роли, если он соответствующим образом сигнализирует о том, что он начал устанавливать свойства, и о том, что он закончил их установку. Следующий код является сокращенной версией метода Обратите внимание, что в начале фазы инициализации код вызывает Beginlnit Каждого компонента , Затем устанавливает свойства, и в конце вызывает Endlnit. Это позволяет элементу управления или компоненту отложить действия с устанавливаемыми свойствами, пока не будет вызван Endlnit, Благодаря чему можно избежать трудностей с установкой взаимосвязанных свойств в правильном порядке показывает простую реализацию ISupportlnitialize В классе, который содержит коллекцию строк. В показательных целях класс выполняет инициализацию, кэшируя любые значения, устанавливаемые в свойстве StringCoiiection, Пока инициализация не будет завершена. Для этого класс делает следующее. Он реализует интерфейс ISupportlnitialize И его методы Beginlnit И Endlnit. Определяются элементы-переменные для хранения первичной коллекции строк, которую инкапсулирует класс, флага, указывающего, что класс инициализируется, и другой коллекции строк для хранения временной копии значения, которое устанавливается для инкапсулируемой коллекции в процессе инициализации. Set-блок свойства StringCollection Проверяет флаг инициализации, и если производится инициализация экземпляра класса, помещает любые устанавливаемые для свойства значения во временную копию. Если класс не инициализируется, значение просто записывается в элемент-переменную первичной коллекции строк. Реализация Beginlnit Устанавливает флаг, чтобы сообщить классу о том, что он находится в режиме инициализации.

Простая привязка данных с помощью источников привязки

рассмотрим простой класс формы приведенный

Простейший способ применения источника привязки состоит в том, чтобы использовать его в качестве посредника между данными и элементами управления, которые эти данные отображают. Рассмотрим простой класс формы, приведенный Эта форма содержит единственную сетку с именем m Grid, в чьем свойстве Dock установлено значение Fill, благодаря чему сетка автоматически заполняет собой всю форму. Класс содержит также в качестве элемента компонент источника привязки, к которому привязана сетка. Все это можно смонтировать в конструкторе, что обычно делается перетаскиванием сетки и источника привязки на форму и установкой их свойств в конструкторе. Однако пока давайте посмотрим, как все это делается без трюков с конструктором. Код в обработчике события для загрузки формы извлекает данные Customers через адаптер таблицы, а затем устанавливает свойство DataSource Источника привязки на таблицу Customers. Поскольку свойство сетки DataSource Уже было установлено в конструкторе на источник привязки, для загрузки и отображения данных Customers в сетке больше ничего не требуется. Когда вы выполняете привязку к таблице в составе набора данных, будь он сильно типизированным или нет, вы в действительности имеете дело с псевдотаблицей по умолчанию для этой таблицы. Каждая таблица имеет псевдотаблицу по умолчанию , И именно она используется в привязке данных.

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

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

i что i такое бизнес

Масса людей возражает против термина «бизнес-объект». Что такое бизнес-объект? Если ваше приложение — игра, являются ли ваши объекты действительно бизнес-объектами? Скорее всего нет. Но для целей этой книги полезно иметь общий термин, обозначающий «те объекты, входящие в ваше приложение, которые не относятся ни к представлению, ни к доступу к данным; которые обычно имеют некоторую встроенную логику, правила, верификацию или поток исполнения; могут сами содержать данные; наконец, которые существуют где-то между тем, что пользователь видит на экране, и кодом, исполняющим запросы к вашему хранилищу данных». Поэтому я буду пользоваться термином «бизнес-объект», а вы при желании можете всякий раз про себя подставлять это более развернутое определение.

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

Осуществление такой привязки данных в. NET 2.0 довольно просто. Как говорилось в предыдущих главах, вся привязка данных в Windows Forms основана на наборе интерфейсов, которые определяют различные возможности объектов и коллекций в контексте доступа и навигации по данным. Пока объекты, используемые для привязки данных, поддерживают соответствующие интерфейсы, привязанные к данным элементы управления не будут замечать, что они работают со специальными объектами, а не с внутренними реляционными объектами данных. NET Framework. Пока класс Customer Является простым сильно типизированным контейнером для значений данных, относящихся к некоторой рабочей единице. Каждое из этих значений является примитивом. NET; на самом деле это простейший тип примитивов для привязки данных — строки. Если бы так было со всеми рабочими объектами, все было бы просто. Но дело в том