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

Наиболее распространенные параметры используемые для баз данных SQL Server

b существуют другие имена параметров

Наиболее распространенными параметрами, используемыми для баз данных SQL Server, являются параметры Server, Database, Trusted Con — Nection, User Id И Password. Существуют другие имена параметров, которые дают тот же результат, что и перечисленные , Так что вы можете сами решить, какие из них использовать для типичных сценариев соединения. Из этого примера вы можете видеть, что с SQL Express 2005 можно использовать параметр AttachDbFileName Для спецификации базы данных по файловому пути. Ключевое слово |DataDirectory | является специальной синтаксической конструкцией, которая предписывает объекту соединения искать файл в рабочем каталоге исполняющегося приложения. Строка соединения специфицирует также, что экземпляром сервера является экземпляр по умолчанию SQLEXPRESS, a Trusted_Connection=True Указывает интегрированную защиту, т. е. вы будете авторизованы в базе данных с использованием идентификации из учетной записи Windows, под которой запущено приложение. Вы можете также явным образом передать в строке соединения имя пользователя и пароль, если захотите воспользоваться авторизацией SQL Server. Обычно вам не потребуется в своих приложениях жестко кодировать стоки соединения, как это сделано в листинге Г. З. Лучше размещать их в вашем конфигурационном файле, причем как Visual Studio 2005, так и. NET 2.0 поддерживают новую развитую модель для размещения строк соединения и других специальных и пользовательских установок в файлах конфигурации, в то же время позволяя обращаться к ним программно, сильно типизированным образом. Эти возможности подробно описываются в главах 2 и 5.

Вам требуется поддерживать только одностороннюю привязку данных

как уже упоминалось компонент b

Если вам требуется поддерживать только одностороннюю привязку данных, для получения всех элементов данных достаточно будет интерфейса LEnumerable, И для отображения можно использовать данные, обнаруженные при последней привязке. Как уже упоминалось, компонент BindingSource Может проходить по объектам коллекции, реализующие только LEnumerable, Чтобы поместить эти объекты в свой внутренний список элементов, и В Этой точке можно в Windows Forms привязать данные к компоненту BindingSource, Поскольку он поддерживает интерфейс IList. Методы Add, Insert, Remove, RemoveAt И Clear Упрощают манипуляцию элементами в коллекции как упорядоченном списке переменной длины. Методы Contains И IndexOf В сочетании с индексатором обеспечивают прямой доступ к содержимому коллекции как для чтения данных для отображения, так и для модификации содержимого в заданной позиции списка. Свойства IsFixedSize И IsReadOnly Дают вам знать, можно ли модифицировать содержимое коллекции, и если да, то до какой степени. Поскольку другие элементы IList специально предназначены для поддержки модификации списка, вы редко встретитесь с коллекцией, которая была бы совершенно немодифицируема, и обычно по умолчанию устанавливается модифицируемость. Однако можно было бы найти и такие коллекции, которые поддерживают переключение в режим только для чтения или в режим фиксированного размера. Данные свойства позволяют проверить наличие такого режима перед попыткой модифицировать содержимое коллекции, которая привела бы к исключению в случае, если коллекция была помечена как допускающая только чтение или как имеющая фиксированный размер.

Интерфейс ITypedList: экспонирование свойств привязки данных

через этот интерфейс код потребителя

Интерфейс ITypedList Позволяет экспонировать или получать доступ к информации о типе относительно свойств, определяемых элементами коллекции. Через этот интерфейс код потребителя может сказать коллекции: «Расскажи мне все об элементах данных, которые ты содержишь». Эта информация широко используется конструктором Visual Studio, Когда вы на этапе проектирования декларативно конфигурируете привязанные элементы управления, например, при установке конфигурации столбцов сетки DataGridView В зависимости от типизированных свойств элементов в привязанной коллекции. Он может использоваться и во время выполнения, чтобы менять поведение в зависимости от динамически раскрываемых типов свойств элементов коллекции. Типы, реализующий интерфейс ITypedList, могут поддерживать раскрытие информации о типе содержащихся в них элементов данных, на этапе проектирования или во время выполнения. Классы DataView И Bin — DingSource Реализуют ITypedList, И информация, экспонируемая их реализациями, позволяет раскрывать информацию о типе относительно содержащихся элементов данных. Поскольку каждая таблица DataTable Экспонирует DataView По умолчанию, это делает информацию о типе для данных в DataTable Доступной через интерфейс ITypedList. Элементы этого интерфейса показаны в таблице 7.7. Описание метода GetltemProperties Может несколько напоминать порочный круг •— вы передаете массив дескрипторов свойств, чтобы получить обратно коллекцию дескрипторов свойств. Проще всего понять, что здесь происходит, если разобраться в реализации DataView Этого интерфейса. Если вы получите интерфейсную ссылку ITypedList На DataView И вызовете затем через нее GetltemProperties С параметром Null, То метод возвратит коллекцию объектов PropertyDescriptor, Которые описывают каждое поле таблицы данных, на которую ссылается псевдотаблица. Листинг 7.1 далее в этой главе демонстрирует пример использования GetltemProperties Для получения дескрипторов свойств столбцов в таблице.

Интерфейс ICollection: управление доступом к коллекции

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

Вы можете использовать интерфейс ICollection, Чтобы выяснить число существующих в коллекции элементов, копировать элементы коллекции в массив, выяснить, поддерживает ли коллекция синхронизацию для многопоточных сценариев, или получить доступ к синхронизирующему объекту коллекции, чтобы реализовать свою собственную блокировку синхронизации. Это следующий ориентированный на коллекции интерфейс в иерархии наследования после LEnumerable И LEnumerator. Он является производным от LEnumerable, Поэтому для реализации ICollection Нужно реализовать также и LEnumerable. Он вводит несколько элементов, определяющих атрибуты коллекции, помогающие контролировать доступ к элементам коллекции.

Возможно, самым важным и часто используемым элементом, входящим в интерфейс ICollection, Является свойство Count. Если у вас есть коллекция, которая реализует только LEnumerable, То единственным способом выяснить, сколько в ней элементов — это получить перечислитель и и перебрать все элементы, подсчитав их в своем собственном цикле. Писать такого рода код очень скучно и долго, в то время как коллекции, реализующие ICollection, Позволяют пользователям получать число элементов в коллекции прямо из свойства Count, Что возлагает бремя о этого значения на класс-реализатор, как и должно быть.

Метод СоруТо Позволяет потребителю коллекции получить копию всех элементов коллекции в форме типизированного массива, так что он может оперировать этими элементами, не беспокоясь о других потребителях коллекции. Метод принимает два аргумента: ссылку на массив и индекс, указывающий, с какого элемента коллекции должно начинаться копирование. Массив, передаваемый вызывающим, должен иметь тип, подходящий для размещения элементов коллекции, и размер, достаточный для копирования всех элементов, начиная с указанного индекса. Конечно, прежде чем воспользоваться этим методом, вы должны принять во внимание и издержки производительности, связанные с копированием каждого элемента. Если же приемлемо непосредственное манипулирование элементами коллекции, то не стоит и беспокоиться о предварительном их копировании в отдельный массив.

Если коллекция поддерживает одновременный доступ из нескольких потоков, ее нужно синхронизировать. Это означает, что в ней должен быть реализован механизм блокировки, гарантирующий, что не будет возникать состояний «гонок», когда, например, один поток пытается обратиться к элементу коллекции, который был только что удален другим потоком. Детали синхронизации выходят за рамки этой главы, однако есть много других книг, предоставляющих сведения по этой теме.

Перехват добавлений и удалений

вам нужно позаботиться также о

Для перехвата добавлений и удалений вам нужно переопределить еще некоторые методы базового класса BindingList<T>, Такие, как Insertltem, Removeltem И Clearltems, И обеспечить выполнение одних тех же изменений как в первичной, так и в несортированной коллекции. Вам нужно позаботиться также о транзакционных добавлениях к коллекции, поэтому потребуется переопределение EndNew И CancelNew, А также транзакционное удаление из несортированной коллекции. Как видите, все усложняется весьма быстро. Чтобы продемонстрировать базовые возможности сортировки, давайте не будем поддерживать добавление и удаление элементов, когда коллекция сортирована. Вам все равно потребуется сделать копию существующей коллекции перед применением сортировки и возвратиться к этой копии, когда сортировка отменяется, но вам не нужно будет беспокоиться о добавляемых или удаляемых элементах и о поддержке параллельной коллекции, когда коллекция сортирована. Как уже упоминалось, класс List<T> Имеет встроенную возможность сортировки, и вы можете воспользоваться ей для выполнения действительной сортировки. Класс производит сортировку, исходя из обобщенной реализации интерфейса Icomparer<T>, Которую вы передаете методу. Для реализации этого интерфейса вы создаете класс с методом Compare, Который сравнивает объекты типа т и возвращает целое, показывающее, равен ли первый объект второму, больше он или меньше второго объекта. Какой критерий вы используете для решения о том, какое значение возвращать, определяется вами и вашей реализацией интерфейса. Реализация в листинге 9.4 использует идеи, взятые из рубрики Майкла Вайнхардта «Wonders of Windows Forms» в «MSDN Online», которые сами восходят к более ранней статье Рокки Лотка. Я выбрал другую стратегию реализации и добавил возможность сортировки по нескольким свойствам, которая показана далее в обсуждении реализации интерфейса IBindingListView, но некоторые основные детали следующей реализации были взяты из серии статей Майкла «Custom Data Binding» в зимних выпусках 2004 года.