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

Инициализация сетки

в этом методе есть закомментированная

После инициализации данных конструктор вызывает вспомогательный метод InitGrid, Который делает следующее: Применяет к коллекции Rows Метод AddCopies, Чтобы добавить к сетке еще миллион строк. В этом методе есть закомментированная строчка, которая позволяет изменить готовый пример VirtualMode Так, чтобы он использовал привязку к данным коллекции объектов; тем самым вы сможете увидеть различие двух подходов в плане расхода памяти и времени загрузки. После этого контроль над происходящим переходит к механизмам управления событиями Windows Forms. Поскольку для сетки был установлен виртуальный режим, далее начнет вызываться обработчик OnCellVa — LueNeeded Для каждой ячейки, видимой в сетке в данный момент. Код этого метода извлекает из коллекции данных соответствующие значения для ячеек, отображаемых в первых двух столбцах. Для третьего столбца метод фактически вычисляет значение ячейки на ходу, используя класс Random Для генерирования случайных чисел. Он также устанавливает флаг в коллекции M Visited, Который позволяет вам определить, сколько строк действительно отображалось при прокрутке сетки за время работы приложения. Когда вы запустите образец приложения VirtualMode из листинга 6.2, обратите внимание, что при перемещении по ячейкам в третьем столбце сетки случайные числа в них изменяются. Это происходит потому, что обработчик события CellValueNeeded Вызывается при каждой перерисовке ячейки, а не только когда она впервые появляется в области сетки, отображаемой при прокрутке, а класс Random В качестве семени для вычисления следующего случайного числа использует текущее время. Поэтому получаемые для ячейки значения при каждом вызове CellValueNeeded Зависят от времени, и вы, возможно, захотите воспользоваться какой-то лучшей стратегией для вычисления и кэширования этих знаений, чтобы они не изменялись просто из-за перемещения курсора по ячейкам.

Улучшенное управление источниками

net x это был по

До сих пор мы имели дело исключительно с индивидуальными элементами управления на форме и привязкой источников данных непосредственно к этим элементам. В. NET 1.x это был, по существу, единственный путь. Однако одна из проблем такого подхода состоит в том, что если во время выполнения требуется сменить источник данных, на который опирается несколько привязанных элементов управления, то вам придется написать код для переустановки каждого из них. Кроме того, если вам требуется выяснить, какой элемент в привязанной коллекции является текущим, или получать уведомления о смене источника, вам придется через контекст привязки глубоко погрузиться в устройство формы, чтобы получить доступ к синхронизирующим объектам. В. NET 2.0 все эти проблемы решает компонент BindingSource. Источник привязки играет роль посредника между привязанными элементами управления и ассоциированным с ними источником данных. Он обеспечивает комплексное решение для доступа или управления контекстом привязки для одного или нескольких элементов управления на форме. Вы привязываете элемент управления на форме к источнику привязки, а его, в свою очередь, привязываете к источнику данных. Если вам требуется сменить источник данных, к которому привязаны элементы управления, вам достаточно будет изменить значения свойств DataSource И DataMember В источнике привязки; все привязанные к нему элементы управления автоматически обновятся. Если вам требуется определить текущий элемент в источнике данных, вы можете получить его непосредственно через источник привязки. Если вы хотите программно изменить текущий элемент в источнике данных, в источнике привязки имеются для этого методы и свойства; а если захотите получать уведомления об изменениях в источнике данных, то источник привязки предоставит для этого события, которым можно назначить обработчики. Отношения между источником привязки, привязанными элементами управления и источником данных изображены на рис. 3.3.

Если мы объединим код из листингов 3.2, 3.3 и 3.4, чтобы собрать все привязки данных для сетки, комбинированного списка и текстовых полей в одном примере, добавим к форме источник привязки и модифицируем элементы управления так, чтобы они были привязаны не к источнику данных, а к источнику привязки, то код будет выглядеть следующим образом:

Программное создание набора данных

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

Чтобы программно создать и заполнить набор данных, вам не потребуется ничего, кроме понимания объектной модели и вызова методов и свойств этих объектов. Программное конструирование и заполнение наборов данных является довольно необычным делом, поскольку требует утомительного и уязвимого для ошибок кодирования, которое нужно будет обновлять при всяком изменении схемы ваших данных. Едва ли не единственным случаем, когда вы, возможно, заходите создать набор данных программно, является случай, когда у вас имеется какая-то жестко закодированная или неструктурированная информация, которую вы хотите представить в табличной форме; тогда вы можете загнать ее в набор данных, который сможете привязать к элементу управления DataGridView. Но в таком случае было бы лучше выделить эту структуру в XML-файл и загружать ее оттуда, чтобы не нужно было модифицировать исходный код при изменении структуры или содержания представляемых данных. Другим случаем, когда вы могли бы программно работать с набором данных подобным образом, является тот, когда вы хотите добавить к таблице в наборе данных вычисляемый столбец. Код в листинге Г. 2 показывает, как создать простой набор данных, включающий вычисляемый столбец, и загрузить в него некоторые данные. Код листинга Г.1 конструирует таблицу данных и добавляет к ней желаемые столбцы, а также ограничение первичного ключа. Обратите внимание, что для вычисляемого столбца используется третий аргумент конструктора DataColumn, Который является выражением, используемым для вычисления значения этого столбца во время выполнения. Код добавляет новую таблицу к набору данных и создает затем новую строку. После установки значений столбцов в новой строке она добавляется к коллекции Rows Таблицы. Заметьте, что новая строка должна создаваться из таблицы, чтобы она имела корректную схему для включения ее в эту таблицу, но на самом деле она не войдет в таблицу, пока не будет добавлена к коллекции Rows.

Какое отношение имеет привязка данных к интерфейсам?

в случае реляционных данных коллекции

Когда вы имеете дело с данными, то работаете обычно с коллекциями элементов данных, где каждый из элементов является объектом, который содержит значения или свойства, представляющие дискретные единицы данных, к которым вы привязываетесь. В случае реляционных данных — коллекции данных, собранных в таблицу — элементами данных являются строки в таблице, а свойства являются столбцами в строках. Обычно вы фокусируете внимание на уровне таблицы и рассматриваете строки и столбцы как детали табличных данных. В действительности всякий раз при привязке к DataTable Вы привязываетесь к псевдотаблице по умолчанию для данной таблицы. Так что на самом деле ключевым классом, на котором следует сосредоточить внимание при работе с наборами данных в. NET, является DataView, А его элементами данных являются экземпляры DataRowView. В случае специальных рабочих объектов внимание обращено в основном на уровень элементов данных, где каждый элемент данных является экземпляром рабочего объекта. Эти объекты могут быть заключены в некоторый объект-коллекцию, служащий контейнером или родительским объектом для элементов данных, подобно тому, как DataView Является контейнером для объектов DataRowView. Эти объекты-коллекции позволяют вам группировать экземпляры объектов, так что вы можете сохранять только ссылку на саму коллекцию и использовать ее для доступа к отдельным объектам, когда они вам понадобятся. Поскольку объектом является все что угодно и термин этот сильно перегружен, то при обсуждении данных или рабочих объектов он может приводить к путанице. Поэтому для описания отдельных объектов в коллекции я вместо термина Объект буду часто пользоваться термином Элемент данных. Элемент данных может быть экземпляром специального рабочего объекта, экземпляром типа. NET Framework, который содержит некоторые интересующие нас данные, таким, как объект Filelnfo, Или объектом реляционных данных, как, например, экземпляр DataRowView, Принадлежащий DataView.

Создание привязки данных для элементов управления при помощи окна Properties

в окне properties представлен также

Если вы выберете в конструкторе форм элемент управления, например TextBox, А затем откроете окно Properties, в этом окне будут доступны все свойства этого элемента, которые можно устанавливать на этапе проектирования. В окне Properties представлен также ряд псевдосвойств, которые не соответствуют каким-либо действительным свойствам элемента управления, но позволяют интерактивно генерировать или модифицировать код. Например, когда вы меняете псевдосвойство Для элемента управления в окне Properties, вы не изменяете какое-либо свойство экземпляра класса, но меняете имя самого этого экземпляра как переменной. Вот почему это свойство заключено в окне Properties в скобки, поскольку оно не соотносится с действительным свойством в экземпляре элемента управления. Установка псевдосвойства В конструкторе приведет к тому, что изменятся все генерируемые конструктором строки кода, использующие данную переменную. Фактически Visual Studio 2005 идет еще дальше, обнаруживая упоминания этого именованного экземпляра в других проектах и обновляя их таким же образом. Аналогичным образом вы можете задать в окне Properties значения нескольких свойств, что открывает широкие возможности проектирования, причем во многих случаях также будет генерироваться более одной строки кода. К таким свойствам относятся свойства Datasource И DataMember Любых элементов управления со сложной привязкой к данным, свойства DisplayMember И ValueMember Элементов управления с выбором, таких, как ComboBox Или ListBox, А также набор псевдосвойств Для любого элемента управления. Когда вы выбираете свойство Datasource, DataMember, DisplayMember Или ValueMember Некоторого элемента управления в окне Properties, появляется всплывающее окно, напоминающее уменьшенный вариант окна Data Sources. Это окно припарковано к свойству, которое вы устанавливаете в окне Properties