5. Общее представление об интерфейсах привязки данных

Элементы управления с единственным значением таких как Text Box

можно также явно вызывать методы

Для элементов управления с единственным значением, таких, как TextBox, Для установки свойства Text Используют обычно выражения привязки данных или устанавливают значение программно из методов кода поддержки. Можно также явно вызывать методы или свойства кода поддержки в выражении привязки данных, если они являются защищенными или открытыми элементами класса кода поддержки. Например, чтобы установить свойство Text Элемента TextBox На странице, используя свойство из кода поддержки с именем CurrentCustomersID, Можно было бы написать в ASPX-странице такой код: Заметьте, что все обсуждавшееся до сих пор относилось к отображению данных, связанных с элементом управления, что является односторонней привязкой к данным. Что же можно сказать о получении обновлений от привязанных элементов управления, если пользователь редактирует данные? А то, что именно здесь вы сталкиваетесь с ограничениями, накладываемыми моделью Web запрос-ответ. У сервера нет никаких способов знать, утвердит ли вообще пользователь эти изменения, и не имеет смысла держать в памяти сервера экземпляры элементов управления, связывая тем самым ресурсы. Поэтому всякий раз, когда страница отображается, эта страница и все ее дочерние элементы управления создаются, используются и уничтожаются. Если пользователь делает в браузере изменения в отображаемых данных при посредстве элементов управления и отсылает их обратно, это выражается в форме нового запроса, обычно отсылки к той же странице в приложении ASP. NET. Изменившиеся данные вернутся как параметры отправления формы для входных элементов управления страницы, и страница должна будет заново ассоциировать полученные значения с новыми экземплярами элементов управления, которые она создает в процессе обработки отсылки. Тем самым, с программной точки зрения, создается видимость, что вы работаете с тем же экземпляром элемента управления, что и при начальном отображении страницы, хотя в действительности это не так. В результате трудно достигнуть впечатления истинной двусторонней привязки к данным, поскольку для этого требуются долгоживущие экземпляры элементов управления, существующие в течение всего взаимодействия с пользователем, также как и питающие их источники данных.

Интерфейсы участвующие в привязке данных

эти коллекции могут быть специальными

Интерфейсы, участвующие в привязке данных, предназначены для заключения двустороннего контракта между привязанными к данным элементами управления и коллекциями объектов данных, используемыми этими элементами. Эти коллекции могут быть специальными рабочими коллекциями, содержащими рабочие объекты, или какими-то из типов коллекций и объектов. NET Framework, таких, как коллекция DataView, Содержащая объекты DataRowView. Благодаря использованию этих интерфейсов для определения коммуникаций между привязанными элементами управления и объектами данных, элементам управления не требуется знать о конкретных типах объектов, к которым они привязаны, а объектам данных не нужно ничего знать о специфических возможностях привязанных к ним элементов управления. Когда вы будете понимать, что представляют собой интерфейсы и для чего они предназначены, вся «магия» привязки данных окажется не более чем дымом и зеркалами, а говоря точнее, просто работой интерфейсов, вовсе не магических, но тем не менее очень мощных. Хотя материал этой главы может показаться вам слишком «грубой материей», для его чтения имеется ряд веских причин. Первая из них та, что для подлинного понимания происходящего в привязке данных и для поиска причин возникающих проблем необходимо понимать, что происходит «за кулисами». Привязка данных приводится в действие интерфейсами, обсуждаемыми в этой главе, и работой элементов управления и компонентов. NET Framework с объектами, реализующими эти интерфейсы. Вторая причина состоит в том, что если вы собираетесь использовать в привязке данных специальные коллекции объектов, то вам придется реализовать некоторые из этих интерфейсов, чтобы обеспечить саму возможность привязки коллекции и редактирования ее объектов через привязанные элементы управления. Наконец, если вы собираетесь реализовывать специальные элементы управления, поддерживающие привязку данных, или просто программно работаете с коллекцией в своем приложении, при реализации кода привязки к данным и программной логики вы будете выступать в качестве клиента этих интерфейсов.

Организация виртуального режима

создайте сетку и определите в

Ниже описывается последовательность действий для организации привязки данных в виртуальном режиме. Создайте сетку и определите в ней столбцы, которые будут работать в виртуальном режиме. Переведите сетку в виртуальный режим, установив ее свойство VirtualMode Равным True. Ели вы не применяете привязку данных, добавьте к сетке нужное число строк, чтобы обеспечить поддержку прокрутки. Самым простым и быстрым способом сделать это является создание единственной строки-прототипа, любое количество копий которой можно добавить затем к сетке методом AddCopies Коллекции Rows. В данный момент не нужно беспокоиться о содержимом ячеек, так как вы собираетесь предоставлять его динамически в обработчике события, в процессе отображения сетки. Последним шагом является подключение обработчика для события CellValueNeeded Сетки. Это событие возбуждается только в том случае, если сетка функционирует в виртуальном режиме, и будет запускаться для каждой видимой в настоящий момент ячейки несвязанного столбца либо при первом ее отображении, либо при прокрутке сетки показывает простое приложение Windows Forms, демонстрирующее использование виртуального режима. Объект DataGridView Был помещен на форму в конструкторе и назван M Grid; Также на форму была добавлена кнопка с именем M GetVisitedCountButton Для проверки того, сколько строк появлялось в сетке в результате прокрутки. Конструктор формы, как обычно, начинается с вызова InitializeCom — Ponent, Чтобы исполнить код, генерированный в результате операций перетаскивания и установок в окне Properties. В данном примере этот код просто объявляет и создает на форме сетку и кнопку. Затем код конструктора назначает посредством неявного делегирования два обработчика событий. Для виртуального режима важен первый из обработчиков — для события CellValueNeeded. Как уже упоминалось, это событие возбуждается только в виртуальном режиме сетки и запускается для каждой ячейки несвязанного столбца, видимой в сетке в любой данный момент. Когда пользователь прокручивает сетку, это событие вновь запускается для каждой из ячеек, появляющихся в процессе прокрутки. Конструктор также назначает обработчик для события щелчка на кнопке, который позволяет вам посмотреть, для скольких строк в действительности вызывался обработчик события CellValueNeeded

Добавление экземпляров столбчатой диаграммы в контейнер

этот метод показан в листинге

Метод AddBarChartControl Получает дескрипторы свойства для для всех столбцов или свойств в соответствующем элементе данных, определяет, является ли поле численным типом, исходя из свойства PropertyType Его дескриптора, а затем извлекает имя и значение поля и добавляет соответствующую пару ChartPair К свойству Data Столбчатой диаграммы. Этот метод показан в листинге 8.10.

Метод AddBarChartControl Создает экземпляр BarChartControl, Инициализирует его размер и положение, после чего добавляет его к коллекции Controls Инкапсулирующего пользовательского элемента управления. Затем он проходит в цикле по всем свойствам переданного ему элемента данных, и если это численный тип или строка, которую можно преобразовать в численный тип, к коллекции Data Столбчатой диаграммы добавляется соответствующая пара ChartPair. Обратите внимание на применение нового метода TryParse Класса Double. Каждый примитивный класс в. NET имеет метод Parse, Существующий начиная с версии 1.0 библиотеки Framework. Проблема с методом Parse Состоит в том, что если ему не удастся преобразовать переданную строку, он выбросит исключение, а это очень дорогостоящее действие, которое может сдерживать производительность приложения, если производится достаточно часто. Поэтому В Framewok версии 2.0 к каждому примитивному типу добавлен метод TryParse, Который позволяет вам попытаться преобразовать строковое значение в значение примитивного типа, не выбрасывая исключения. Если преобразование удается, метод возвращает булево значение True, И вы можете использовать значение из переданного вами второго параметра метода. Как вы можете видеть, не так уж много кода требуется для того, чтобы самостоятельно обрабатывать привязку данных без источника привязки, выполняя простую итерацию по источнику данных и отображая данные, однако в этом коде отсутствует еще очень многое, с том числе поддержка сортировки, фильтрации, редактирования, добавления новых строк и т. п., что делает за вас источник привязки. Метод ListBindingHelper.GetList Обеспечивает аспекты первоначального исследования и раскрытия при отыскании соответствующего списка в источнике данных. Для осуществления всего прочего потребуется работать с рядом других типов интерфейсов. Для этого вы обычно захотите воспользоваться поддержкой источника данных.

Большинство элементов управления предназначено для привязки к разнообразным типам коллекций и элементов данных

для этого можно применить метод

Поскольку большинство элементов управления предназначено для привязки к разнообразным типам коллекций и элементов данных, обычно приходится прибегать к динамически типизированному разрешению элемента, к которому вы пытаетесь привязаться. Для этого можно применить метод DataBinder.Eval: Здесь, чтобы попытаться найти на текущем элементе в привязанной коллекции данных свойство или поле CustomeriD и вернуть его значение, используется рефлексия.

ASP. NET 2.0 поддерживает упрощенный синтаксис DataBinder.Eval, Использующий метод Eval. Следующее выражение: дает тот же результат, что и более длинная конструкция с методом Data — Binder.Eval. В. NET 2.0 имеется также новый метод Bind, Который целесообразно использовать вместо Eval Для выражений, применяемых к коллекциям, поддерживающим обновление при обратных отсылках. Если вы собираетесь разрешить пользователю редактировать данные в элементе управления, и этот элемент привязан к источнику данных, поддерживающему долговременные обновления, то, если имеет место отсылка с отредактированными данными, метод Bind Вызовет для привязанного источника метод обновления. Такого рода автоматическое обновление поддерживается, в частности, классами GridView, DetailsView И FormView. Следует пользоваться методом Bind Вместо Eval Во всех случаях, когда вы устанавливаете свойства в шаблоне для одного из новых привязанных элементов управления, и когда вы устанавливаете с помощью свойства DataSourcelD Источник данных, поддерживающий обновление при отсылках.