4. Привязка объектов контроля к источникам данных

Механизм преобразования типов

когда вы определяете свои собственные

Механизм преобразования типов устроен так, чтобы его можно было расширять. Когда вы определяете свои собственные типы, вы можете также определить для них конвертеры типа. Вы можете ассоциировать конвертер типа с типом, свойством или методом при помощи атрибута TypeConverterAt — Tribute. Конвертер типа используется привязкой данных Windows Forms И многими другими процессами в среде.NET Framework. Вы можете также реализовать Специальные форматеры , если вам требуется применять форматирование, выходящее за рамки возможностей встроенных форматеров. Тематика данной книги не охватывает реализацию собственных конвертеров и форматеров, но богатый набор конвертеров типа и обработчиков формата, имеющихся в.NET Framework, способен удовлетворить ваши потребности почти во всех ситуациях, связанных с привязкой данных. Для простых типов, таких, как целые или строки, чье обычное представление заключает в себе все содержимое данных в их сохраняемой форме, никаких преобразований типов на самом деле не требуется. Но для более сложных типов баз данных, таких, как Image, Datetime Или чисел с плавающей точкой, форматеры могут преобразовывать сырые данные в совершенно другой объектный тип. В следующих разделах мы рассмотрим несколько примеров привязки данных сложных типов, чтобы проиллюстрировать, как все это работает. Код для нескольких следующих разделов содержится в загружаемом образце приложения ComplexTypeBinding.

Привязка данных в ASP. NET 1.x

net x поддерживалась привязанными к

Привязка к данным в ASP. NET 1.x поддерживалась привязанными к данным элементами управления, привязанными к данным выражениями в разметке страницы, источниками данных и обработкой событий привязки, которая являлась частью цикла отображения станицы. Механизмы привязки к данным ASP. NET 1.x по соображениям обратной совместимости продолжают работать в ASP. NET 2.0, и вы по-прежнему будете пользоваться многими из тех же самых программных конструкций. Однако общий подход довольно сильно изменился, и появился ряд новых элементов управления, поддерживающих новый процесс, описываемый в оставшейся части этого приложения. Кроме того, в Visual Studio 2005 по сравнению с Visual Studio. NET 2003 имеются некоторые существенные изменения в самой разработке приложений. Для управлений разработкой Web-приложений больше не используются проекты; вы просто работаете с отдельными файлами и артефактами, которые содержатся в Web-папке. Имеются также новые возможности вроде динамической компиляции кода поддержки и обратных вызовов сценария, которая позволяет серверным элементам управления обновлять свое содержимое в браузере без полной отсылки всей страницы. Однако стоит вспомнить, как работала привязка к данным в ASP. NET 1.x, чтобы понять различия между моделью привязки к данным Web и моделью Windows Forms на случай, если вы столкнетесь с какими-то существующими приложениями ASP. NET, построенными до появления. NET 2.0. Вы по-прежнему можете применять в приложениях ASP. NET 2.0 элементы управления из ASP. NET 1.x, но рекомендуется все же придерживаться нового подхода привязки к данным, чтобы сократить объем кода, который вам придется писать и сопровождать. Привязанные к данным элементы управления ASP. NET 1.x следуют тому же процессу привязки к данным, что и соответствующие элементы управления Windows Forms. Например, элемент управления DataGrid Из ASP. NET является сложным табличным элементом, который позволяет показывать таблицы с данными, выбирать строки, редактировать их, сортировать столбцы и пролистывать данные. DataGrid Имеет свойство DataSource, Которое вы устанавливаете на коллекцию данных, и свойство DataMember, Которое можно использовать для уточнения того, какую коллекцию внутри этой коллекции вы хотите использовать для сложных контейнеров данных, таких, как набор данных.

Автоматическая установка размера столбцов

как и случае многих других

Одной из новых особенностей элемента управления DataGridView является его способность по ряду критериев автоматически вычислять ширину столбцов, чтобы содержимое вписывалось в столбцы. Как и случае многих других возможностей сетки, все, что вам для этого требуется — это установить соответствующее свойство нужного столбца, а сетка сделает все остальное. Говоря конкретнее, свойством, ответственным за автоматическую установку ширины, является свойство AutoSizeMode класса DataGridViewColumn. Устанавливая это свойство равным одному из значений перечисления DataGridViewAutoSizeColumnMode, описанных в таблице 6.5, вы можете управлять установкой ширины столбцов в сетке. Одним из наиболее полезных значений является All Се 11S. Я рекомендую всегда использовать его, если только это не слишком ухудшает эффективность для больШиХ наборов данных или в некоторых ячейках у вас получаются слишком длинные значения. Эта установка гарантирует, что строки содержимого ячеек не будут переноситься. Кроме того, не забывайте устанавливать свойство FormattingApplied Аргумента события, если вы предоставляете значения ячеек динамически. В противном случае установка AutoSizeMode Для одного из значений в строке приведет к бесконечному циклу. В качестве простого примера рассмотрите следующий код, являющийся модификацией кода из листинга 6.1, для установки ширины вычисляемого столбца FullName: Режим Fill Обладает мощным потенциалом в плане максимального использования наличного пространства в сетке, но может быть несколько труден для понимания. В принципе, когда вы устанавливаете для всех столбцов режим Fill, Их ширина будет устанавливаться равной, и столбцы будут заполнять границы сетки так, что горизонтальная полоса прокрутки не потребуется. Если свойство MinimumWidth Любого из столбцов в режиме Fill Больше, чем ширина, вычисленная по алгоритму заполнения, то будет вместо последней будет использовано значение MinimumWidth, А другие столбцы просто окажутся более узкими, так чтобы они все равно укладывались в сетку и не требовали горизонтальной прокрутки. Если свойства MinimumWidth Нескольких столбцов таковы, что все столбцы отобразить невозможно, то для тех столбцов, что не могут быть показаны, устанавливается минимальное значение ширины, при этом отображается полоса прокрутки. Значение по умолчанию для минимальной ширины равно всего 5 пикселам, поэтому вы наверняка захотите установить более разумное значение для MinimumWidth, Когда будете работать с режимом Fill.

Поддержка поиска в IBindingList

для эффективного поиска обычно нужно

Последней категорией функций, описываемых интерфейсом IBindingList, Является поиск. Для эффективного поиска обычно нужно как-то индексировать коллекцию. Свойство SupportsSearching Указывает, поддерживает ли коллекция вообще поиск. Если оно возвращает true, вы сможете безопасно вызывать метод Find С дескриптором для свойства, в котором вы хотите искать сопоставление, и объектной ссылкой, содержащей сопоставляемое значение. Если вы реализуете коллекцию, которая поддерживает сортировку и в которой будут находиться большие объемы данных, то для большей эффективности операций поиска вам, возможно, потребуется поддерживать также индексацию данных. Если коллекция поддерживает индексацию, вы можете вызывать метод Addindex Чтобы дать коллекции указание организовать на некотором свойстве индекс, и метод Removelndex, Чтобы удалить ранее добавленный индекс. Например, в конец метода Main На листинге 7.1 можно было бы добавить следующий код, выполняющий поиск некоторого элемента с использованием индексации для ускорения поиска : Реализация на пустом месте коллекции, поддерживающей IBindingList, Требует огромной работы, причем по большей части это кодирование обычных ориентированных на коллекцию функций вроде добавления элементов, удаления элементов, запуска событий ListChanged При изменении коллекции или ее элементов и т. д. До появления. NET 2.0 было мало вариантов, позволяющих уклониться этой работы. Однако класс BindingList В. NET 2.0 значительно упрощает дело, и мы будем подробно исследовать его в главе 9.

Встроенные ячейки заголовка

служат указанием на то что

Ячейки заголовка являются ячейками, отображаемыми вдоль верхней и левой сторон сетки. Они показывают контекст, т. е. служат указанием на то, что именно содержится в ячейках сетки. Ячейки заголовков столбцов имеют тип DataGridviewColumnHeaderCell, а их текст показывает содержание ячеек столбца. Если столбец поддерживает сортировку, ячейка содержит направленный вверх или вниз треугольник; пользователь может сортировать столбец, щелкнув на его заголовке. Обычно текст заголовка устанавливается через свойство HeaderText столбца, либо явным образом в программном коде, либо неявно посредством привязки данных, организованной в соответствии со схемой данных. Вы можете также обращаться к заголовочной ячейке непосредственно через свойство столбца Header — Cell, используя его свойство Value для установки отображаемого текста. Заголовочные ячейки строк имеют тип DataGridViewRowHeaderCell. Они отмечают выбор строки значком треугольника, режим редактирования — значком карандаша, а новую строку — значком звездочки. Заголовочные ячейки строк могут отображать при этом и текст; Вы устанавливаете свойство Value ячейки строковым значением, обращаясь к свойству HeaderCell строки. Заголовки как столбцов, так и строк можно дополнительно настаивать, предусмотрев специальную прорисовку, для чего потребуется обрабатывать событие CellPaint сетки. Заметьте, что если вы осуществляете специальную прорисовку, то сами должны производить все рисование заголовочной ячейки, после чего в свойстве Handled аргумента события Этот код прежде всего проверяет, не является ли индекс рисуемого столбца меньшим нуля; это указывает на то, что прорисовывается заголовок строки. Индекс столбца для заголовков строк равен — 1, и индекс строки для заголовков столбцов также равен — 1. Этими значениями нельзя индексировать коллекцию Cells строки, но можно пользоваться ими в обработчике CellPainting как флагом, позволяющим выяснить, что прорисовывается заголовок.

Кроме того, можно установить в свойстве CellHeader экземпляр класса, производного от DataGridViewCell, и тогда при отображении ячеек заголовка будет использоваться этот тип ячейки. Вы можете определить свой собственный производный класс и выполнять в нем любого рода рисование, форматирование или установку стилей.