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

Конструкция Grid view

затем источник данных обеспечивает автоматическое

Кроме того, конструкция Gridview Ориентирована на работу с управляющими элементами источников данных и позволяет, через привязанный элемент источника, передавать обратно изменения, сделанные пользователем при редактировании данных в элементе управления. Затем источник данных обеспечивает автоматическое сохранение изменений. Большую часть работы с элементом Gridview Можно делать прямо в конструкторе; большинство распространенных сценариев организуются через команды и мастеры конструктора, так что часто вы можете осуществить весьма сложную привязку и форматирование данных, не написав вручную ни строчки кода. Чтобы осуществить простую привязку к данным, вы устанавливаете в свойстве DataSourcelD Элемента управления идентификатор соответствующего элемента источника данных страницы. Как было показано ранее, можно также программно установить свойства DataSource И DataMember И вызвать DataBind, Что позволяет при желании явно управлять процессом привязки к данным. Вы уже видели в этом приложении некоторые простые примеры кода с Gridview. В качестве немного более сложного примера в листинге А.7 показана разметка для Gridview, Все, что требуется для поддержки пагинации — это установить свойство AllowPaging Равным True. Для сортировки вы устанавливаете в True Свойство AllowSorting, После чего специфицируете для каждой из привязанных колонок свойство SortExpression. Редактирование, удаление и выбор реализуются путем добавления к сетке поля CommandField И установки в True Свойств ShowXXXButton Для каждого вида командных кнопок, которые вы хотите поддерживать. Обратите также внимание на использование шаблона для столбца Phone И вызовы методов Eval И Bind Для установки выражения привязки к данным.

Вызов метода EnableVisualStyles

наконец что важнее всего последняя

Вызов метода EnableVisualStyles Позволяет вашей форме отображать тематический внешний вид элементов управления, когда приложение запускается под Windows ХР или более поздней системой. Наконец, что важнее всего, последняя строка кода создает экземпляр вашего класса формы и передает его методу Run Класса Application. Класс Application Предусматривает ряд статических методов и свойств, позволяющих вам писать код в контексте исполняющегося приложения. Метод Run По существу организует в текущем потоке цикл обработки сообщений Windows и запускает исполнение вашего приложения. Если вы не знакомы с программированием Windows во времена седой старины и не знаете, что такое сообщение Windows, не волнуйтесь. Кроме как в очень специфических ситуациях, в. NET вам не нужно даже знать, что они существуют. Они всего лишь низкоуровневый способ, посредством которого объекты окон в операционной системе поддерживают связь друг с другом, а как говорилось ранее, многие элменты. NET представляют собой просто оболочку вокруг объекта окна операционной системы.

Исполнение вашего приложения будет продолжаться, пока не будет закрыто главное окно, что остановит в приложении накачку сообщений и закончит главный поток исполнения. Если вы в процессе исполнения приложения породили другие потоки, то эти потоки могут продолжать свое исполнение, если они были запущены как потоки переднего плана, что и происходит в потоковой модели по умолчанию в. NET. Уже упоминавшийся атрибут STAThread Приписывается методу Main Мастером проектов Windows Forms. Этот атрибут служит здесь для упрощения интеграции с моделью однопоточных разделов элементов управления ActiveX и объектов СОМ. По умолчанию. NET организует для совмещения функций с СОМ многопоточный раздел, а это может породить проблемы для элементов ActiveX и многих компонентов СОМ, особенно тех, что были разработаны при помощи Visual Basic 6 или более ранних версий. Поэтому ради максимальной безопасности и совместимости в сценариях миграции вы должны всегда включать этот атрибут в спецификацию метода Main Приложений Windows Forms, который запускает исполнение потока приложения.

Стыковка элементов управления

в windows forms имеется функция

Закрепление элементов управления решает массу типичных задач размещения, но существует и другая форма планировки, которая также очень полезна в определенных ситуациях. В Windows Forms имеется функция стыковки элементов управления посредством свойства Dock Базового класса Control. Свойство Dock Является перечислением Dockstyle И работает аналогично только что описанному перечислению Anchor. Вы можете состыковать элемент управления в одном из пяти положений: Top, Bottom, Left, Right И Fill. Можно также установить свойство Dock Равным None, Что является его значением по умолчанию. Когда вы стыкуете элемент к некоторой стороне, он изменит свое расположение таким образом, что соответствующая его сторона будет все время «приклеена» к этой стороне формы. Кроме того, он изменит свой размер так, чтобы достигать смежных с ней сторон, заполняя таким образом всю выбранную сторону формы. Оставшаяся сторона элемента управления будет зафиксирована в установленном вами положении, а установки свойства Anchor Будут игнорироваться. Например, на рис. В. 16 на форму был добавлен элемент управления Treeview, А его свойство Dock Установлено равным Left. Тем самым он автоматически изменил свой размер и переместился так, чтобы его левая сторона все время оставалась прикрепленной к левой стороне формы, а верхняя и нижняя кромки раздвинулись вплоть до верха и низа формы. Правая кромка элемента управления остается там, куда ее поместили.

Работа с типами данных ADO. NET

net есть два рода типов

При работе с типами данных ADO. NET есть два рода типов, с которыми вы можете столкнуться: обобщенные классы данных и классы, специфические для провайдера. Обобщенные реляционные классы данных и интерфейсы реализуют абстрактные конструкции реляционной модели — таблицы, строки, отношения, ограничения — и могут содержать данные, поступающие от разнообразных источников. Эти обобщенные классы данных все входят в пространство имен System. Data, которое является корневым пространством имен для элементов библиотеки классов ADO. NET. Однако чтобы обобщенные классы были полезны, вам обычно требуется возможность подключения к хранилищу данных и выполнения запросов, которые заполняют обобщенные контейнеры или обновляют нижележащее хранилище данных в соответствии с изменениями в контейнерах. Классы, которые вы используете для установки соединения и исполнения запросов, являются классами, специфическими для провайдера, находятся в дочерних пространствах имен System. Data и для разных провайдеров различны. В таблице Г.1 перечислены провайдеры, поставляемые с. NET Framework. Классы управляемых провайдеров должны реализовывать общий набор интерфейсов, определяемых в пространстве имен System. Data. Эти интерфейсы определяют базовые методы и свойства для набора классов, который должен поддерживаться каждым управляемым провайдером. Сюда входят классы для установки соединений с источниками данных, для соз-дания команд, исполняющих запросы, для создания адаптеров, заполняющих наборы данных, и для создания параметров, которые ассоциируются с командой для передачи запросу. В ADO. NET 2.0 имеется также набор абстрактных базовых классов для провайдеров данных в пространстве имен System.Data.ProviderBase, Которые позволяют программировать для различных источников данных безотносительно к провайдеру. Тем самым вы можете переключаться на другой нижележащий источник данных, не изменяя ничего в коде вашего приложения. Данная тема несколько выходит за рамки того, о чем я здесь рассказываю, однако вы должны знать о наличии таких возможностей.

Объектные коллекции, которые в. NET 2.0

типизированные наборы данных значительно выигрывают

Объектные коллекции, которые в.NET 2.0 легко определяются через обобщенные коллекции, принципиально более просты в своем устройстве и обеспечивают лучшую производительность, чем наборы данных. Типизированные наборы данных значительно выигрывают в случае данных небольшого объема, особенно если вам нужна поддержка обновлений, удалений и вставок. Но в случае простого отображения большой коллекции данных вам, при использовании набора данных вместо специальной коллекции, придется заплатить немалую цену в смысле памяти и производительности. Выбор между наборами данных и специальными коллекциями Когда вы имеете дело с очень большими коллекциями данных вроде той, что показана в листинге 6.2, в первую очередь следует принимать во внимание требования к памяти. Исходя из уже виденных вами примеров в этой книге вы, возможно, склонны использовать в качестве коллекции данных типизированный набор. Однако прежде чем сделать это, стоит дважды подумать. Хотя усовершенствованный класс DataSet в.NET 2.0 значительно улучшен в смысле масштабируемости и производительности в случае больших наборов данных, он все-таки остается достаточно громоздким объектом из-за всех встроенных в него возможностей поддержки иерархии, отслеживания изменений и обновления. Если вы рассматриваете представление в сетке миллионов строк данных и собираетесь предоставить пользователям возможность редактировать строки, чтобы при этом набор данных передавал сделанные изменения обратно в хранилище данных, то класс DataSet — это, может быть, действительно то, что вам нужно. Однако я бы не советовал вам проектировать свое приложение таким образом. Отображение больших коллекций данных следует рассматривать как особый случай применения, сфокусированный на представлении — вы лишь позволяете пользователю просмотреть большое число строк, чтобы найти интересующий его элемент данных. Если вам нужно поддерживать редактирование этих элементов данных, я предлагаю предоставить для этого пользователю отдельную форму. Однако как вы скоро увидите, можно позволить ему редактировать значения в сетке, избежав при этом накладных расходов, присущих наборам данных.