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

Верификация ввода данных и обработка ошибок

целостности данных и обработка ошибок

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

Простая привязка

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

Простая привязка означает, что элемент управления имеет отдельные свойства, привязанные к отдельным компонентам данных. Такие элементы управления также должны поддерживать свойство для привязки по умолчанию. Сложную привязку данных можно в целях настоящего обсуждения разделить на две категории: сложную привязку выбора и сложную таблично-ориентированную привязку. Сложная привязка выбора поддерживается такими элементами управления, как комбинированный список ComboBox Или список ListBox, С участием источника данных, компонента отображения, компонента значения и выбранного элемента. Сложная таблично-ориентированная привязка предполагает, что отображается в некотором виде вся коллекция данных, поэтому элементу управления требуется лишь источник данных и компонент данных. Создание элементов управления, поддерживающих такие эти привязки, подробно обсуждается в главе 10. Если у вас есть элемент управления стороннего поставщика или собственный специальный элемент управления, снабженный соответствующими атрибутами, позволяющими ему работать с окном Data Sources , То чтобы сделать его доступным для выбора в настройках Data UI Customization, вам необходимо добавить его в окно Toolbox интегрированной среды Visual Studio. Добавить элемент управления в Toolbox можно одним из двух способов. Самый простой способ — это перетащить значок DLL, которая содержит элементы управления, из окна Windows Explorer в окно Toolbox. Второй способ заключается в том, чтобы щелкнуть правой кнопкой мыши в окне Toolbox и выбрать в раскрывшемся контекстном меню команду Choose Items. При этом откроется диалог Choose Toolbox Items, показанный на рис. 5.15. Щелкните на кнопке Browse и найдите сборку, содержащую ваши специальные элементы управления. После выбора сборки содержащиеся в ней элементы будут включены в список и помечены для включения в окно Toolbox. После добавления вашего элемента управления в Toolbox он появится в списке доступных для выбора опций Data UI Customization. Затем вы можете выбрать его для включения в выпадающий список элементов управления в окне Data Sources для компонента данных соответствующего типа.

Программное конструирование DataGridView

кода производится привязка данных сетка

Самым типичным случаем использования сетки является сетка с привязанными столбцами. Кода производится привязка данных, сетка создает столбцы, исходя из схемы или свойств элементов данных, и генерирует строки для каждого элемента данных, присутствующего в привязанной коллекции. Если привязка устанавливалась статически при помощи конструктора, типы и свойства столбцов были заданы на этапе проектирования. Если же вся привязка данных производится динамически, то по умолчанию свойство AutoGenerateColumns Равно True, Так что типы столбцов определяются на ходу по типам привязываемых элементов данных. При работе с сеткой, содержащей только несвязанные данные, вы, возможно, захотите создать и заполнить сетку программным путем. Чтобы представлять себе, какой код для этого потребуется написать, вы должны получше познакомиться с объектной моделью DataGridView. Прежде всего следует понимать, что как и все элементы управления. NET, сетка на форме является просто экземпляром класса. Класс содержит свойства и методы, при помощи которых вы можете программировать его внутреннюю объектную модель. В случае элементов управления DataGridView Объектная модель включает в себя две коллекции , Которые содержат объекты, образующие сетку. Этими объектами являются ячейки или, говоря конкретнее, объекты, производные от DataGridViewCell. Коллекция Columns Содержит экземпляры объектов Da — TaGridViewColumn, А коллекция Rows Содержит экземпляры DataGridView — Row.

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