2. Работа с наборами типизированных данных

Интерфейс ISupportlnitializeNotification: поддержка инициализации взаимосвязанных компонентов

благодаря этому объект зависящий от

Интерфейс ISupportlnitializeNotification Позволяет взаимосвязанным дочерним компонентам получать уведомления о том, что другие объекты закончили инициализацию. Благодаря этому объект, зависящий от состояния другого объекта, может подождать, пока другой объект не закончит свою инициализацию, прежде чем сам попытается завершить свою инициализацию. Только что обсуждавшийся интерфейс ISupportlnitialize Помогает работать с компонентами, свойства которых взаимосвязаны внутри самого компонента. Но что, если у нас имеется несколько компонентов, которые взаимосвязаны в смысле порядка их инициализации? Например, при установке привязки данных вы часто привязываете элемент управления к BindingSource, А затем BindingSource К набору данных. Устанавливаемые во время инициализации свойства BindingSource Будут, вероятно, ссылаться на таблицу в наборе данных. Но таблица в наборе данных, возможно, создается в процессе инициализации набора данных. Таким образом, если Endlnit Для источника привязки вызывается раньше, чем будет вызван Endlnit Для набора данных, набор данных не завершит свою инициализацию, которая делает таблицу доступной для источника привязки. В результате, если источник привязки попытается начать итерацию по данным таблицы, пользователь получит сообщение об ошибке, поскольку требуемая таблица не будет найдена. Чтобы сделать это более наглядным, давайте возьмем класс SomeCon — Tainerclass Из листинга 7.1 в качестве источника данных для источника привязки. Следующий код показывает обработчик события Load Для формы, который использует методы поддержки инициализации, но вызывает Endlnit В неправильном порядке, что ведет к непредсказуемым результатам. Проблема этого кода в том, что поскольку Endlnit Вызывается для источника привязки Раньше, чем для объекта данных, привязка будет производиться при незавершенной инициализации объекта данных. Нам нужен способ гарантировать, что подобные взаимосвязанные объекты будут инициализироваться в правильном порядке. В. NET 2.0 имеется новый интерфейс Говоря конкретнее, интерфейс ISupportlnitializeNotification Позволяет компоненту попросить другой компонент уведомить его, когда он, компонент Б, завершит свою инициализацию. Это позволяет компоненту А подождать, пока компонент Б не завершит свою инициализацию, прежде чем завершить свою собственную, компонента А, инициализацию.

Обработка события ListChanged

об этом вас может уведомлять

Вам придется вызывать этот метод везде, где это необходимо, а именно когда вы узнаете, что нижележащая коллекция данных изменилась. Об этом вас может уведомлять событие ListChanged, Возбуждаемое источником привязки. Продолжая действовать в том же духе, то есть предоставляя конструктору писать за вас как можно больше кода, сделайте следующее. Когда вы нажмете клавишу Enter, конструктор объявит в вашем файле с кодом пользовательского элемента управления обработчик события с соответствующей сигнатурой, и подпишет этот обработчик на событие в файле автоматически генерируемого кода неполного класса. Однако показывать отношения в списке полей фильтрации бессмысленно, так как отношение данных не представляет собою свойства с единственным значением, которое можно фильтровать посредством значения в текстовом поле. Если список содержит рабочие объекты, эти объекты могут иметь свойства, которые также являются коллекциями, а такие свойства не отображались бы в сетке, поэтому они не должны включаться в список. Итак, если свойство не есть свойство для списка, его имя включается в коллекцию строк, и цикл по свойствам элемента данных продолжается. Когда метод завершается, он устанавливает коллекцию строк в качестве источника данных для M FieldsCombo, Что автоматически отображает эти строки в элементах комбинированного поля. Свойство ListChangedType Аргументов события, передаваемых для данного события, позволяет отфильтровать те изменения, что влияют на схему содержащихся в коллекции объектов. Значение Reset Означает, что изменился источник как таковой, а типы изменений PropertyDescriptorAdded И PropertyDescriptorDeleted Позволяют вам обрабатывать случаи, когда источник данных модифицируется программно во время выполнения. Контрольное условие, проверяющее флаг M FiiterlnProgress, Предотвращает переустановку комбинированного списка в случае, когда список изменяется в результате применения фильтра. Это позволяет комбинированному списку сохранить свой текущий выбор, а список строк автозавершения останется таким, каким он был до применения фильтра.

Доступ к данным в ADO. NET

приложение может быть чем то

Важной частью любого реального приложения является получение данных, которые приводят его в действие. Приложение может быть чем-то совсем простым, как игра, которая извлекает и сохраняет предпочтения пользователя и набранные очки. На другом конце спектра может находиться сложное приложение для бизнеса, которое извлекает, обрабатывает и обновляет данные из многих источников, распределенных в сети или в Web, в рамках распределенной транзакции, осуществляемой посредством асинхронной коммуникации, основанной на сообщениях. Спектр того, что представляет собой доступ к данным, чрезвычайно широк и разветвлен, и является предметом рассмотрения многих других книг.

Эта книга, с другой стороны, концентрирует внимание на представлении данных с использованием Windows Forms, и настоящее приложение не ставит задачу научить вас всему, что следует знать о доступе к данным. Я хочу здесь только дать вам твердые основания того, как ввести внутрь и как вывести наружу данные в архитектуре вашего приложения Windows Forms. Я хочу также быть уверенным в том, что вы достаточно знаете о доступе к данным в ADO. NET, чтобы понимать примеры в главах этой книги и, что важнее, как различные формы данных влияют на представление этих данных. Так что по существу я собираюсь показать вам ровно столько, чтобы вы были осведомлены о возможных опасностях. Вы должны уметь разрабатывать привязанные к данным прототипы UI, не нуждаясь в том, чтобы быть экспертом по доступу к данным и строить сначала уровень данных, перед тем как приступить к проектированию и кодированию яруса представления. С другой стороны, вы не должны строить приложения-клиенты, слишком тесно связанные с ярусом данных. Когда речь идет о доступе к данным, существует масса различных способов достигнуть одного и того же результата. Это приложение посвящено доступу к данным на низших уровнях — элементарным основам доступа к данным при помощи

ADO. NET. Глава 2 описывает, как работать с типизированными наборами данных и как осуществляется тот род доступа к данным, который вы будете наиболее часто использовать в своих программах.

Знакомство с интерфейсом IBindingList

методы b ibindinglist b описаны

Свойства интерфейса IBindingList Доступны только для чтения и описываются в таблице 7.8. Методы IBindingList Описаны в таблице 7.9, а единственное событие Все примитивные изменения коллекции, в форме прямого добавления элементов, удаления элементов или с доступом к отдельному элементу, производятся через свойства и методы унаследованного интерфейса IList, как было описано в соответствующем разделе. Функции изменений интерфейса IBindingList позволяют контролировать, можно ли делать в списке изменения или конструировать новые элементы. Метод AddNew предоставляет привязанному элементу управления удобный способ добавления нового элемента к коллекции, которую можно редактировать прямо в элементе управления, причем последнему ничего не требуется знать о типе элемента во время компиляции. Метод возвращает объектную ссылку на созданный элемент, которая может затем быть использована с методами позднего связывания или рефлексией для раскрытия свойств этого элемента и его отображения. Свойства AllowEdit, AllowNew и AllowRemove позволяют коллекции сообщить привязанному элементу управления, какого рода модификации она поддерживает, чтобы элемент управления мог отображаться по-разному в зависимости от возможностей нижележащей коллекции. Например, не имело бы смысла иметь в элементе управления кнопку, добавляющую к коллекции новый элемент, если привязанная к нему в данный момент коллекция не допускает модификаций. Эти свойства доступны только для чтения, поэтому сама коллекция решает, поддерживает ли эти функции. Коллекция может экспонировать другие методы, пусть они и не входят в интерфейс IBindingList, которые позволят коду-потребителю включать и выключать режимы «только чтение» или «фиксированный размер»; соответственно значения, возвращаемые коллекцией в этих свойствах, могут изменяться со временем. Эти свойства первоначально разрабатывались в предположении, что такие аспекты коллекции меняться не могут: она либо поддерживает изменения, либо нет. На уровне представления могут использоваться разные элементы управления, определяющие, собираетесь ли вы разрешить пользователю делать модификации в любой момент времени.

Источник данных — типизированный набор данных входящий в состав вашего проекта Windows Forms

xsc

Если источник данных — типизированный набор данных, входящий в состав вашего проекта Windows Forms, вы можете выбрать в Solution Explorer команду Show All Files, раскрыть ветвь файла типизированного набора данных, и под ним вы увидите файл с расширением. xsc. Если вы устанавливали отображение на элементы управления для каких-либо компонентов данных в наборе при помощи окна Data Sources, этот файл будет содержать код XML, подобный показанному ниже, который регистрирует эти специальные установки отображения в вашем проекте:

Вам никогда не придется писать подобный код вручную, хотя вы, возможно, захотите взглянуть на него, чтобы понять, откуда окно Data Sources берет потребную для него информацию. Как правило, лучше регенерировать ссылку на источник данных при помощи мастера Data Source Configuration, чем пытаться модифицировать этот XML-файл вручную. В случае. xsc-файла вы можете просто удалить этот файл, и он будет генерирован заново в следующий раз, когда вы измените отображение на элементы UI для каких-либо компонентов в наборе данных. При помощи конструктора вы можете генерировать код привязки и другими способами, без участия окна Data Sources, например, используя окно Properties и контекстные вкладки на форме в конструкторе. Окно Properties позволяет декларативно задать свойства элементов управления в конструкторе, что в конечном счете является интерактивным способом написания кода, устанавливающего эти свойства. Однако некоторые манипуляции в окне Properties производят нечто большее, чем простую установку свойств; они генерируют несколько строк кода, создающего объекты привязки и управляющего ими. Контекстные вкладки обеспечивают быстрый доступ к часто используемым функциям и свойствам отдельных элементов управления и компонентов.