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

Переопределение метода Clone базового класса

ваш заменяющий метод должен возвращать

Другим важным моментом определения специального типа столбца является переопределение метода Clone Базового класса. Ваш заменяющий метод должен возвращать новую копию вашего столбца, все свойства которого установлены теми же значениями, что и в текущем экземпляре столбца. Этот метод используется редакторами столбцов Visual Studio для добавления и редактирования столбцов сетки в диалогах, показанных на рис. 6.4 и 6.5. Последнее, что делается в специальном классе столбца — это переопределение свойства CellTempiate. Если кто-то обращается к значению CellTempiate, Код получает его из базового класса. Но если кто-то попытается изменить CellTempiate, Установщик проверит, что устанавливаемым типом ячейки является StatusCell. Если это не так, он возбуждает исключение, предотвращая тем самым программную установку неправильного типа ячейки для данного столбца. Это не помешает вам в случае гетерогенной сетки размещать в столбце ячейки других типов. Теперь, когда вы определили специальные типы ячейки и столбца, как вы можете их использовать? Конечно, вы можете ввести эти определения в качестве части любого проекта Visual Studio, но вообще, когда вы создаете нечто подобное, имеет смысл утилизировать это в различных приложениях. Если вы хотите утилизировать код, вам нужно поместить этот код в библиотеку классов. Поэтому вы определяете проект библиотеки классов, добавляете в библиотеку, в качестве встроенных в проект ресурсов, только что описанные классы вместе с изображениями, которые вы хотите выводить для представления состояний. В результате будет создана сборка, на которую вы можете ссылаться из любого приложения Windows, где вы захотите использовать свои типы ячейки и столбца. Для этого требуется лишь установить ссылку на сборку в проекте Windows Forms, где вы хотите их использовать, и специальные типы столбцов появятся в диалоге Add Column, как показано на рис. 6.8 . В своем приложении Windows Forms вы можете добавить к сетке столбец StatusColumn Либо программно, либо воспользоваться для этого конструктором. Если вы добавите столбец при помощи конструктора и посмотрите затем на диалог Edit Colums, вы увидите, что в списке свойств появилось свойство DefaultStatus, Которое можно устанавливать его допустимыми значениями.

Свойство is Synchronized

если оно возвращает b true

Свойство IsSynchronized Показывает, поддерживает ли коллекция синхронный доступ из нескольких потоков. Если оно возвращает True, Можно ожидать, что коллекция гарантирует для нескольких потоков безопасное одновременное добавление, удаление и доступ к ее элементам. Если свойство возвращает False, То гарантировать одновременный доступ к коллекции только одного потока обязан пользователь. Последний случай более распространен, поскольку введение в коллекцию механизмов блокировки для поддержки параллельного доступа может привести к существенному снижению производительности для всех, кто использует коллекцию. Обычно лучше заставить тех немногих, кому нужен параллельный доступ, заплатить за него некоторую цену в форме написания дополнительного кода, чем обречь на ухудшение производительности всех остальных потребителей коллекции. Свойство SyncRoot Предоставляет объектную ссылку, которую потребители коллекции могут использовать при реализации своей собственной блокировки для поддержки параллельного доступа. Ожидается, что коллекция возвращает объектную ссылку, которую можно использовать с монитором или оператором Lock, И если потребитель захватывает полученный объект, то блокировка должна предотвращать доступ к элементам коллекции со стороны любого другого потока, пока она не будет снята. Обычно коллекция просто возвращает ссылку на себя, если это ссылочный тип, и захват самого объекта блокирует доступ из другого потока к любым элементам класса до момента снятия блокировки. Однако в определенных ситуациях вы могли бы использовать в целях блокировки не сам объект коллекции, а содержащийся в ней объект. Для потребителей главное в том, что они должны суметь принять объектную ссылку, возвращаемую из SyncRoot, И захватить ее, после чего можно быть уверенным, что другие потоки не смогут обращаться, добавлять или удалять элементы коллекции, пока блокировка не снята. Обобщенной версией интерфейса является ICollection<T>. Если вы создаете сильно типизированную коллекцию, экспонирующую свой счетчик и поддерживающую сценарии копирования и многопоточного доступа. Факторизация интерфейсов ICollection<T> И IList<T> Несколько отличается от их нетипизированных собратьев. Несколько элементов интерфейса IList Реализованы в иерархии наследования на LCollection<T>, Включая Add, Remove, Contains, Clear И IsReadOnly . На самом деле имело бы смысл поместить их ниже, на уровне коллекции, поскольку они не специфичны для упорядоченной индексированной коллекции, какую представляет IList. Однако на данном этапе Microsoft не может факторизовать интерфейсы ICollection И IList, Поскольку они существуют со времен. NET 1.0 и это привело бы в негодность огромные объемы уже написанного кода.

Реляционная схема для XML-документа с заказчиками и заказами

если файл был создан путем

Если код XML содержит встроенную XML-схему, набор данных попытается использовать ее для установления реляционной схемы таблиц и отношений, а затем загрузит данные в эту схему. Если файл был создан путем сохранения существующего набора данных, то при его чтении все будет нормально. Однако не всякий XML-файл подходит для загрузки в набор данных. Если его схема такова, что один и тот же тип элемента может появляться на различных уровнях иерархии, то при попытке загрузить документ в набор данных вы получите исключение ArgumentException, Поскольку набору данных не удастся привести его к реляционной схеме. Например, если бы вы в листинге Г.1 добавили элемент Customers в качестве дочернего для элемента Orders и попытались прочитать файл методом ReadXml, Было бы выброшено ArgumentException. Кроме того, если имеет место собственно недопустимый XML, при вызове ReadXml Будет выброшено XmlException, Поэтому определенно следует заключить вызов ReadXml В блок обработчика исключения. Вы можете заполнить набор данных одним из трех основных способов: либо загрузив его из файла, либо программно, либо через запрос к базе данных. В. NET 2.0 вы можете также работать с объектами DataTable Изолированно от набора данных, а также загружать таблицу при помощи считывателя данных методом Load. Давайте будем двигаться от простейшего способа к наиболее сложному, и начнем с загрузки и сохранения наборов данных в файлах, а именно XML-файлах. Метод ReadXml Может принимать путь к файлу, открытый объект потока или объект считывателя XML или текста. Он также принимает необязательное перечисление XmlReadMode, Которое управляет выведением схемы и чтением из XML.

Генерация привязок данных при помощи контекстных вкладок

чтобы воспользоваться контекстной вкладкой нужно

Контекстные вкладки — новый функциональный элемент в конструкторе форм Visual Studio 2005, который позволяет получить доступ к часто используемым настройкам свойств и поведения элементов управления или компонентов в конструкторе, не используя окно Properties или команды меню. Чтобы воспользоваться контекстной вкладкой, нужно щелкнуть на маленьком треугольнике, отображаемом в верхнем правом углу компонента или элемента управления, когда он выбран, .

В зависимости от типа выбранного элемента управления или компонента его контекстная вкладка может быть простой или сложной, либо он может вообще не иметь контекстной вкладки. Вкладка на рис. 5.20 отображает внизу два пункта, доступные в контекстной вкладке любого элемента управления или компонента, в качестве источника данных которого прямо или косвенно установлен типизированный набор данных. Элемент Add Query открывает диалог Search Criteria Builder для формирования критериев поиска ; этот диалог позволяет добавить новый запрос в типизированный набор данных, к которому привязан элемент управления. Если вы введете в этом диалоге новый запрос и примете его, запрос будет добавлен в привязанный адаптер таблицы. Вы можете использовать этот запрос для заполнения таблицы данными. Он позволяет специфицировать параметризованные запросы, которые будут возвращать наборы строк для заполнения таблицы, удовлетворяющих критериям поиска. Если вы введете запрос, не возвращающий строк, то при щелчке на ОК получите сообщение об ошибке. Это означает, что диалог распознал введенный вами запрос как запрос, не возвращающий данных. Также вы можете сконструировать запрос при помощи описанного в главе 2 построителя запросов, щелкнув на кнопке Query Builder в диалоге Search Criteria Builder. Когда вы вводите новый запрос при помощи диалога Search Criteria Builder, на форму добавляется новый элемент управления ToolStrip, а в файл исходного кода добавляется соответствующий код поддержки. Это позволяет ввести критерий поиска и выполнить поиск, при этом результаты отобразятся в привязанном элементе управления, для которого был генерирован новый запрос. Генерированный Toolstrip Включает метку для имени поля с критерием поиска, текстовое поле для ввода критерия и кнопку для исполнения поиска.

Обнаружение ошибок в наборах данных

класс b datarow b экспонирует

Наборы данных и их дочерние объекты, такие, как таблицы и строки, имеют встроенную поддержку для отслеживания ошибок данных. Класс DataRow Экспонирует свойство RowError, В котором можно установить сообщение об ошибке, указывающее, что где-то в этой строке произошла ошибка, и дающее описательную информацию об этой ошибке. Говоря конкретнее, вы должны также, если нужно, устанавливать информацию об ошибке, ассоциированную с отдельными полями данных, которые явились причиной ошибки. Для этого вы вызываете метод setCo — LumnError Класса DataRow. Метод имеет три перегрузки. Первая принимает ссылку типа DataColumn И сообщение об ошибке как строку.

Обычно эти ошибки будут устанавливаться ADO. NET в ответ на ошибку при исполнении запроса к базе данных, но в развитых сценариях вы можете устанавливать их вручную, как показано в этом примере.

Когда устанавливаются какие-либо ошибки в наборе данных, являющемся источником данных для элемента управления DataGridview , То в зависимости от этих ошибок сетка будет отображать значки ошибки строки и ошибки ячейки, как было описано ранее. Это происходит потому, что класс DataRowView, Являющийся действительным источником отображаемых в сетке данных, реализует интерфейс IDataErrorlnfo, Делающий эту информацию об ошибке непосредственно доступной для любого элемента управления, которому при этом нет надобности знать объектную модель конкретного типа источника данных, чтобы обнаруживать ошибки в этом источнике. Если для любого столбца в строе или самой строки была установлена ошибка, то считается, что и в самой таблице имеются ошибки, как и в содержащем ее наборе данных. Если вы знаете, что работаете с набором данных, то можете воспользоваться объектной моделью набора данных для извлечения информации об ошибках в этом наборе. Оба класса DataSet И DataTable Экспонируют булево свойство HasErrors, Которое можно проверить, чтобы узнать, имеются ли какие-либо строки с ошибками. Если свойство HasErrors Набора данных возвращает true, вы можете итерировать коллекцию Tables Набора данных и определить, в какой таблице имеют место проблемы, проверяя свойство HasErrors Каждой таблицы.