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

Изменение порядка столбцов

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

Переупорядочение столбцов является встроенной функцией сетки, которая позволяет пользователям изменять порядок отображения столбцов в сетке во время выполнения. Поскольку разные пользователи уделяют некоторым столбцам больше внимания, чем другим, пользователи часто просят, чтобы у них была возможность самим устанавливать порядок отображаемых столбцов. Хотя такую возможность можно было бы поддерживать программно, удаляя столбцы из сетки и затем вставляя их в новой позиции, это потребовало бы в общем случае утомительного написания большого объема кода. Поэтому разработчики группы Windows Client были настолько любезны, что позаботились о встроенной функции переупорядочения в самом элементе управления сетки. В дополнение к общим свойствам и поведению, которые можно конфигурировать через контекстную закладку, есть масса других свойств и событий, конфигурацию которых можно задавать на этапе проектирования в окне Properties. Установка любого из этих свойств генерирует соответствующий код в методе InitializeComponent Неполного класса для формы, создаваемого конструктором. Что особенно важно, в окне Properties можно конфигурировать любые свойства привязки данных. Возможно, вы захотите устанавливать при помощи этого окна стили, поскольку вы сразу можете видеть результаты этих установок в конструкторе и убедиться, что получается именно то, что вам нужно. Более подробно стили обсуждаются в конце этой главы. Она работает следующим образом. Если свойство AllowUserToOrderColumns Установлено в True И пользователь захватывает и тянет мышью заголовок столбца, сетка позволяет перетащить и сбросить столбец в позицию, где он хочет его разместить. Столбцы справа от позиции сброса будут сдвинуты на одну позицию вправо, а столбцы, окружающие первоначальную позицию перемещаемого столбца, сомкнутся после того, как столбец будетперемещен. Рис. 6.6 показывает это в процессе выполнения. В данном случае захвачен и перемещается влево столбец QuantityPerUnit. Перетаскиваемый заголовок столбца обозначается серым прямоугольником соответствующего размера. Когда вы перемещаете курсор к одной из сторон другого столбца, граница между этим столбцом и смежным с ним темнеет, показывая, куда будет помещен перетаскиваемый столбец после того, как вы отпустите кнопку мыши.

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

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

Важно, чтобы спецификация источников и компонентов данных была Единообразной для всех элементов управления на форме. Если вы при указании источника используете для разных элементов управления разные типы ссылок, то вы не получите синхронизированного обновления элементов управления при изменении текущего выбора на форме. Если бы вы не захотели придерживаться данного правила и специфицировали привязку текстовых полей так, как было показано выше, то для того, чтобы синхронизация текстовых полей и сетки не нарушилась, необходимо было бы соответствующим образом специфицировать источник и компонент данных для сетки. Нужно модифицировать обработчик события загрузки формы: Рекомендуется все же устанавливать источник данных на списочном уровне и избегать составных компонентов данных . Исключением является случай, когда дело касается привязки к сложному объекту, содержащему единственный сложный дочерний объект. Возьмем, к примеру, объект 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». Если вы, кроме того, привязываете некоторые столбцы к данным, то строки будут заполняться посредством привязки и вам нужно будет обрабатывать только события, относящиеся к виртуальному режиму, для столбцов, не привязанных к данным. Если вы не производите привязку данных, вам нужно добавить к сетке столько строк, сколько вы собираетесь в ней представлять, чтобы сетка могла правильно масштабировать полосу прокрутки. Затем вам нужен какой-то способ получения значений, соответствующих столбцам виртуального режима, когда они потребуются для представления сетки. Это можно сделать, вычисляя значения динамически по мере необходимости, и это является одним из важнейших случаев применения виртуального режима. Можно было бы также использовать кэшированные данные на стороне клиента в форме коллекции объектов или набора данных, либо действительно проделывать полный цикл двустороннего обмена с сервером для получения требуемых данных. В последнем случае необходима разумная стратегия опережающей загрузки и кэширования, иначе приложение быстро увязнет в обмене данными между клиентом и сервером, когда пользователь будет прокручивать сетку. Если же отображаются данные вычисляемые, то действительно имеет смысл не торопиться с вычислением значений, пока они действительно не понадобятся для отображения.