5. Общее представление об интерфейсах привязки данных

Встроенные типы столбцов

работа с некоторыми другими типами

Использовать столбец текстовых полей достаточно просто: вы привязываетесь к данным, которые могут быть представлены в виде текста, или устанавливаете свойство Value Равным чему-то, что допускает преобразование в строку, и дело сделано. Работа с некоторыми другими типами ячеек может оказаться не столь очевидной, поэтому в этом разделе мы рассмотрим каждый из встроенных типов столбцов, отмечая его возможности и то, как им пользоваться. Прежде всего следует понимать, что хотя большая часть функциональных возможностей DataGridView Лежит на уровне ячейки и может поддерживать поведение, подобное поведению «электронных таблиц» , в основе своей сетка остается табличным элементом управления. Столбцы сетки обычно отражают информацию, которую можно определить на этапе разработки, — а именно, схему представляемых данных. Строки обычно определяются динамически во время исполнения и отображаются на структуру, описываемую столбцами. Изредка вам приходится программно создавать столбцы в зависимости от динамических схем данных во время выполнения, но даже тогда вы сначала определяете форму данных, а затем предоставляете собственно данные. Как следствие, для каждого из встроенных типов ячеек, которые может отображать сетка, имеется соответствующий тип столбца, предназначенный для ячеек именно такого типа. Каждый тип ячейки производится от класса DataGridViewCell, А каждый из соответствующих типов столбцов — от DataGridViewColumn. Каждый из типов столбцов экспонирует свойства, предназначенные для привязки его данных, и каждый тип столбца соответствует ожидаемому содержимому того типа ячеек, что объединены в столбец. Аналогичным образом каждый производный тип ячейки может экспонировать дополнительные свойства в зависимости от типа содержимого, для которого предназначена ячейка.

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

Обновление при помощи наборов данных и сохраняемых процедур

если вы запустите для базы

Не удивительно, что для разговора об обновлениях при помощи сохраняемых процедур нам потребуются какие-то сохраняемые процедуры, производящие обновления. Если вы запустите для базы данных Northwind скрипт из листинга Г. 7, то получите простые сохраняемые процедуры SELECT, UPDATE, INSERT и DELETE, работающие с таблицей Region, которые подойдут для работы с любым набором данных, содержащим данные из таблицы Region. Чтобы ничего здесь не усложнять и сосредоточить внимание на вызове сохраняемых процедур для обновления, эти процедуры не имеют никакой конкурентной защиты. Как уже упоминалось при обсуждении построителей команд, запросы, требуемые для проверки оптимистической конкуренции по каждому из столбцов в строке, становятся запутанными и очень неэффективны. Лучшим способом будет использование столбца для отметки времени или версии строки, либо столбца, который обновляется значениями даты и времени всякий раз, когда строка изменяется. Вы можете затем использовать его для обнаружения нарушений конкуренции, и тогда вам потребуется проверять единственный столбец и переносить единственный дополнительный параметр, чтобы узнать, не обновил ли кто-нибудь строку с тех пор, как она была извлечена.

Заметьте, что в данном случае столбец RegionID не является автоматически нумеруемым идентификационным столбцом, поэтому вы должны передавать ID как параметр даже для вставок. Если у вас есть столбец идентификации, который будет генерироваться при выполнении вставки на стороне сервера, то вам нужно будет сделать этот столбец выходным параметром сохраняемой процедуры, а затем устанавливать этот параметр в сохраняемой процедуре значением @@IDENTITY. Тогда новое идентификационное значение будет передаваться из сохраняемой процедуры обратно и помещаться в строку, инициировавшую вставку, в таблице на стороне клиента. Имея сохраняемые процедуры, которые можно вызывать, вам нужно написать немного кода, чтобы подготовить все команды, необходимые для извлечения и обновления набора данных при помощи этих сохраняемых процедур. Следующий код показывает простой метод, который вызывает сохраняемую процедуру GetRegions Для заполнения набора данных, являющегося элементом охватывающего класса.

Использование выражений привязки данных

в результате получается другая форма

Вместо того, чтобы явным образом устанавливать свойства DataSource И DataMember В коде поддержки, как показано в листинге А.2, вы можете для организации привязки к данным воспользоваться конструктором Visual Studio, добавляя с его помощью к странице соответствующий элемент набора данных. В результате получается другая форма синтаксиса привязки к данным, поддерживаемая в ASP. NET — выражения привязки данных в коде разметки. Следующий код показывает модифицированный

Конструкция <%# … %’-> отмечает в коде разметки выражение привязки данных. Выражения привязки данных не оцениваются, пока не будет вызван метод соответствующего элемента управления, либо непосредственно, либо методом DataBind Или событием страницы. Свойства элементов управления могут устанавливаться непосредственно в разметке путем спецификации их в теге как атрибутов вместе с нужными значениями. Значение может быть статическим, как в случае строки «Customers» для свойства DataMember В предыдущем образце кода, либо динамическим в форме сценария ASP. NET или выражения привязки данных, как в случае свойства DataSource. Вам все равно потребуется код в классе поддержки, который извлекает данные из источника и помещает их в экземпляр набора данных, к которому сетка привязана через выражение привязки данных. Вам также потребуется сделать явный вызов DataBind Для элемента управления или страницы, чтобы запустить исполнение выражения привязки данных в разметке, которое устанавливает свойство DataSource Страницы на набор данных. Когда DataBind Вызывается на уровне страницы, страница вызывает DataBind Для всех своих дочерних элементов управления.

Другие элементы управления следуют другим методикам привязки к данным. Например, ListBox И DropDownList Позволяют показать список пунктов, и вы можете отслеживать также ассоциированное с ними скрытое значение, во многом аналогично элементам управления ListBox И DropDownList В Windows Forms. Для элементов управления ListBox И DropDownList Вы устанавливаете DataSource И опционально DataMember, Чтобы определить, чем является набор данных, с которым вы работаете. Затем вы устанавливаете в свойстве DataTextField Имя поля внутри каждой строки набора, которое вы хотите показать в списке.

Верификация организована вокруг элементов управления и событий

привязанные к данным элементы управления

Как и большинство аспектов программирования Windows Forms, верификация организована вокруг элементов управления и событий. Привязанные к данным элементы управления возбуждают события, давая возможность писать специальный код для выполнения верификации. Помимо событий, возбуждаемых элементами управления, в состав Framework входит элемент управления ErrorProvider, который обеспечивает стандартизованный способ уведомления пользователя о любых проблемах верификации, простой для понимания с точки зрения как конечного пользователя, так и программиста, организующего верификацию. Сложные элементы управления, вроде DataGridView, Имеют встроенную поддержку для отображения ошибок верификации по месту, чтобы уведомлять пользователя о проблеме прямо там, где она возникает. Имеется встроенная поддержка на уровне форм для каскадирования верификационных проверок вверх и вниз по иерархии элементов управления. Этим устраняется необходимость писать массу кода проверок, гарантирующих, что каждый элемент управления на форме будет удовлетворен теми данными, которые он содержит. Все это, сведенное воедино, дает вам различные способы и возможности гарантировать, что в ваше приложение попадут только хорошие данные, и что когда произойдет ошибка, вы сможете дать пользователю ясные указания, чтобы помочь ему справиться с проблемой. Именно событие Validating Вы чаще всего будете обрабатывать в сценариях привязки данных. Когда элемент управления решает, что ввод завершен, обычно потому, что фокус ввода переходит к другому элементу управления на форме, он должен запустить событие Validating. Событие имеет тип CancelEventHandler, Который принимает аргумент типа CancelEvent — Args. Класс CancelEventArgs Имеет единственное булево свойство с именем Cancel, Которое вы можете установить, чтобы сигнализировать, что запущенное событие не должно завершиться. Устанавливая Cancel Равным True, Вы возвращаете элементу управления сигнал о том, что в коде, обрабатывающем событие, верификация потерпела неудачу.

Работа с классом XmlDataDocument

он является производным от b

Класс XmlDataDocument Служит мостом между мирами реляционных и иерархических данных. Он является производным от XmlDocument, Так что он «является» XmlDocument В чистейшем смысле объектно-ориентированного наследования и, таким образом, экспонирует все средства класса XmlDocument Для хранения и манипулирования данными XML. Он инкапсулирует также в качестве свойства DataSet, Который позволяет вам обращаться ко всему или к части содержимого XmlDataDocument Как к реляционным данным.

Есть два типичных способа использования XmlDataDocument. Первый — это загрузить XML в документ, а затем обращаться к его свойству DataSet Для привязки данных, итерации по содержимому в объектной модели набора данных или синхронизации содержимого с базой данных. Второй способ — взять DataSet, Уже содержащий данные, и конструировать из него XmlDataDocument И использовать для программирования операций с данными средства XML.

Чтобы загрузить данные XML в XmlDataDocument И иметь к ним доступ через его свойство DataSet, Вам нужно, прежде чем вы будете загружать XML, установить в XmlDataDocument Схему набора данных. Класс XmlDataDocument Не может вывести схему набора данных при чтении XML из файла или строки, как это делает метод DataSet.ReadXml. Однако если вы сначала предоставите его инкапсулированному набору данных схему, а затем прочитаете XML, он сможет ассоциировать читаемые элементы XML и их атрибуты со схемой набора данных, после чего к этим данным можно будет обращаться через свойство DataSet Объекта XmlDataDocument. Вы можете видеть, что эти данные можно рассматривать как содержащие два рода данных, Customer и Address, и что между ними существует родительско-дочернее отношение. В наборе данных это было бы представлено двумя таблицами данных с отношением данных между ними. Чтобы загрузить эти данные в XmlDataDocument И обращаться к ним через свойство DataSet, Вам нужно сначала указать объекту XmlDataDocument, Какую схему набора данных использовать при чтении XML.