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

Единообразная спецификация источников и компонентов данных

если вы при указании источника

Важно, чтобы спецификация источников и компонентов данных была Единообразной для всех элементов управления на форме. Если вы при указании источника используете для разных элементов управления разные типы ссылок, то вы не получите синхронизированного обновления элементов управления при изменении текущего выбора на форме. Если бы вы не захотели придерживаться данного правила и специфицировали привязку текстовых полей так, как было показано выше, то для того, чтобы синхронизация текстовых полей и сетки не нарушилась, необходимо было бы соответствующим образом специфицировать источник и компонент данных для сетки. Нужно модифицировать обработчик события загрузки формы: Рекомендуется все же устанавливать источник данных на списочном уровне и избегать составных компонентов данных . Исключением является случай, когда дело касается привязки к сложному объекту, содержащему единственный сложный дочерний объект. Возьмем, к примеру, объект Customer И его свойство Address. Свойство Address Содержит экземпляр сложного типа со свойствами City, State И т. д. для этого экземпляра. В этом случае можно было бы для привязки к адресной информации одиночного объекта Customer Использовать составной компонент данных. Для привязки к свойству City Можно установить в качестве источника данных объект Customer, Но в качестве компонента специфицировать Address.City. Если вы внесете это изменение в дополнение к изменениям для текстовых полей, показанным в листинге 3.5, и запустите приложение, то при выборе в сетке различных строк текстовые поля будут синхронно обновляться, как раньше. Поскольку теперь для источников данных специфицирована в точности одна и та же ссылка на объект, для всех элементов управления будет создан только один синхронизирующий объект. В то время как устаревший элемент управления DataGrid Мог быть привязан к набору данных и мог отображать иерархическую навигацию по содержащимся в наборе таблицам, сетка DataGridView Предназначена для одновременной привязки только к одиночному списку. Если установить для свойства DataSource Сетки DataGridView Набор данных и не специфицировать таблицу в свойстве DataMember, Сетка останется пустой.

Вы вызываете GetltemProperties с нулевым параметром

вообще говоря это зависит от

Если вы вызываете GetltemProperties С нулевым параметром, то получаете обратно описатели свойств для элементов данных списка. Зачем же нужен этот параметр? Вообще говоря, это зависит от того, какая коллекция реализует интерфейс, но в случае DataView Вы можете использовать его для получения дескрипторов свойств родственных таблиц. Если таблица, оболочкой которой является DataView, Имеет отношение К другой таблице, в возвращаемой для псевдотаблицы коллекции будет дескриптор свойства, представляющего отношение, которое экспонирует дочерние строки в другой таблице. Если вы передадите этот дескриптор свойства методу GetltemProperties Псевдотаблицы, то получите обратно дескрипторы свойств для родственной псевдотаблицы.

Метод GetListName Возвращает просто имя списка, который будет возвращаться методом GetltemProperties. Поведение DataView Здесь таково, что если вы передадите методу весь массив дескрипторов, соответствующий возвращаемой GetltemProperties Коллекции, то получите имя таблицы. Если у вас есть сложный контейнер коллекций, подобный DataSet, Вы можете возвращать имена других коллекций в контейнере, когда передаются их дескрипторы свойств. Этот метод на самом деле не применяется нигде, кроме старого элемента управления DataGrid, Где он используется для отображения имен дочерних списков при навигации по иерархической коллекции коллекций. Ниже приводится простая реализация ITypedList В BindingList, Которая сортирует дескрипторы свойств.

Загрузка наборов данных из файла

b если у вас есть

Класс DataSet Поддерживает два метода для сохранения в файле и загрузки из файла: WriteXml И ReadXml. Если у вас есть данные в наборе данных и вы хотите сохранить их на диске или в потоке, вы вызываете WriteXml. Кода вы хотите прочитать их обратно, вы вызываете ReadXml. Поскольку речь идет о файлах формата XML, вы могли бы создать документ XML, пригодный для чтения набором данных, некоторым другим способом. В действительности документ не обязательно должен поступать из файла; метод ReadXml Может принимать поток, который может быть представлен файлом, сетевым потоком или потоком в памяти. Например, вы могли бы получить XML-документ через Web-службу, прочитав его в набор данных, а затем отобразить его в элементе управления DataGridView. Есть еще метод GetXml, Который позволяет получить содержимое набора данных как XML-строку. Метод ReadXml Способен вывести из несложного файла XML соответствующую схему, а затем преобразовать этот XML в набор данных. Он будет рассматривать корневой элемент документа как контейнер для набора данных. Он будет затем рассматривать каждый элемент, содержащий другие элементы, в качестве строки таблицы, а каждый элемент, содержащий только текст, как столбец этой строки. Метод может также обрабатывать схемы, где элементы представляют строки таблицы, но значения столбцов закодированы не как дочерние элементы, а как атрибуты этого элемента. Например, простой XML в листинге Г.1 будет загружен в набор данных, который будет содержать таблицу заказчиков и таблицу заказов, и будет иметь ограничения внешнего ключа и отношения между двумя таблицами, представляющие их вложенную природу. Соответствующая реляционная схема показана на рис. Г.2.

Вы решили воспользоваться виртуальным режимом

вы можете либо предоставлять все

Когда вы решили воспользоваться виртуальным режимом, у вас есть две возможности. Вы можете либо предоставлять все значения для строки, обрабатывая события виртуального режима, либо совмещать столбцы сетки с привязанными к данным и с несвязанными столбцами. Столбцы, которые будут заполняться в виртуальном режиме, должны определяться, как было описано в разделе «Программное конструирование DataGridView». Если вы, кроме того, привязываете некоторые столбцы к данным, то строки будут заполняться посредством привязки и вам нужно будет обрабатывать только события, относящиеся к виртуальному режиму, для столбцов, не привязанных к данным. Если вы не производите привязку данных, вам нужно добавить к сетке столько строк, сколько вы собираетесь в ней представлять, чтобы сетка могла правильно масштабировать полосу прокрутки. Затем вам нужен какой-то способ получения значений, соответствующих столбцам виртуального режима, когда они потребуются для представления сетки. Это можно сделать, вычисляя значения динамически по мере необходимости, и это является одним из важнейших случаев применения виртуального режима. Можно было бы также использовать кэшированные данные на стороне клиента в форме коллекции объектов или набора данных, либо действительно проделывать полный цикл двустороннего обмена с сервером для получения требуемых данных. В последнем случае необходима разумная стратегия опережающей загрузки и кэширования, иначе приложение быстро увязнет в обмене данными между клиентом и сервером, когда пользователь будет прокручивать сетку. Если же отображаются данные вычисляемые, то действительно имеет смысл не торопиться с вычислением значений, пока они действительно не понадобятся для отображения.

Создание специального содержания с помощью несвязанных столбцов

могу вас успокоить что для

Теперь, когда вы понимаете, как программно создавать столбцы и строки и заполнять их значениями, у вас может возникнуть вопрос, неужели придется заниматься всем этим всякий раз, когда вам потребуется представить содержимое в ячейке, не привязанной к данным? Могу вас успокоить, что для большинства сценариев, где вы захотите представлять непривязанные данные, существуют более быстрые способы. Вам потребуется программно создать все столбцы сетки, но вы можете воспользоваться событиями, чтобы сделать процесс заполнения сетки несколько проще, особенно в случаях, когда вы совмещаете привязанные данные и несвязанные столбцы. Несвязанный столбец — это столбец, не привязанный к данным. Вы добавляете к сетке несвязанные столбцы программно, и заполняете их значениями либо программным путем, как показано в предыдущем разделе, либо используя события, что будет обсуждаться ниже. Вы все равно можете добавлять к сетке столбцы, автоматически привязываемые к столбцам или свойствам элементов в источнике данных. Это делается после создания столбца, путем установки его свойства DataPropertyName. Затем вы можете добавлять и несвязанные столбцы. Строки сетки будут созданы, когда вы установите свойство DataSource Сетки на источник данных, как это делалось в простом случае привязки, при этом сетка будет перебирать строки или объекты в источнике данных, создавая для каждой строки или объекта новую строку.