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

Модифицированная привязка данных для TextBox

если вы внесете в код

В этом случае, поскольку источником данных является сам набор данных, вы специфицируете подлежащий привязке столбец, предваряя имя столбца именем таблицы, отделенным точкой, подобно тому, как это делается при указании компонентов типа в коде. NET. Если вы внесете в код образца приложения SimpleNorthwindClient только эти изменения и запустите его снова, то, как и прежде, текстовые поля отобразят значения, соответствующие первой строке сетки. Но если вы щелкнете на другой строке сетки, то обнаружите, что текстовые поля не обновляются. Хотя и сетка, и текстовые поля с одним и тем же источником данных , Способ спецификации источника для этих элементов управления различен с точки зрения механизмов привязки. Для сетки в качестве источника данных была специфицирована таблица Customers В наборе данных. Фактически компонент данных для сетки пуст или нулевой, поскольку он не был указан, а источником данных для текстовых полей является сам набор данных, а не таблица в нем. Эта важная тонкость подвела многих разработчиков, пытавшихся в сложных сценариях привязки данных синхронизировать между собой привязанные элементы управления. Механизмы привязки данных создают отдельный синхронизационный объект для каждого источника данных, который был специфицирован в коде. Но даже когда две привязки опираются на один и тот же логический источник данных, ожидаемой синхронизации не получится, если в этих привязках источник был специфицирован по-разному, поскольку у них будут разные синхронизационные объекты, созданные для каждого из различных способов спецификации источника. Чтобы решить эту проблему, нужно только придерживаться единообразного способа спецификации источников и компонентов данных, и тогда поведение элементов управления, привязанных к одному и тому же источнику данных, будет синхронизованным.

Возвращение считывателя данных

часто это действие состоит в

Возвращение считывателя данных гораздо быстрее, чем возвращение набора данных, так как вы не можете непосредственно оперировать содержимым считывателя; все, что вы можете, это быстро извлечь данные из считывателя и что-то с ними сделать. Часто это действие состоит в том, что вы используете эти данные для конструирования и заполнения некоторой объектной модели, а это именно то, что приходится делать набору данных и адаптеру данных, когда вы заполняете набор данных. Вот почему заполнять набор данных гораздо дольше, чем возвращать считыватель данных. В случае набора данных у вас имеется полная объектная модель в памяти, к которой вы имеете произвольный доступ для чтения/записи. Чтобы достичь того же с помощью считывателя данных, вам придется вытащить данные из строк, поступающих от считывателя, и начинить ими свою собственную объектную модель, прежде чем вы сможете делать с ними что-то осмысленное. В крупномасштабных объектно-ориентированных системах вам, возможно, именно это и потребуется сделать прежде всего. Типизированные наборы данных превосходны в качестве весьма легких, простых для конструирования и хранения в памяти объектов передачи данных, которыми вы можете оперировать в среднем ярусе дляобработки или передавать клиенту для представления. Однако часто ваши объекты среднего яруса должны не только инкапсулировать данные — они должны инкапсулировать еще и поведение. В этом случае вы, вероятно, будете проектировать свою собственную объектную модель, где многие из объектов могли бы инкапсулировать состояние, которое хранится в устойчивой форме в базе данных. Считыватель данных отлично подойдет в этом случае для быстрого чтения данных в объект или набор объектов, полученных от запроса извлечения к базе данных.

Допустим, например, у вас есть класс Customer, Определенный в вашей рабочей объектной модели, который инкапсулирует состояние и поведение, ассоциированные с заказчиками. Когда вы хотите работать с коллекцией заказчиков, вы извлекаете данные из базы данных подобно вышеприведенному коду, получая считыватель данных, который позволяет прочитать данные, ассоциированные с заказчиками. Теперь вам нужно перетащить эти данные в свои объекты заказчиков.

Конструкция 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. Тем самым он автоматически изменил свой размер и переместился так, чтобы его левая сторона все время оставалась прикрепленной к левой стороне формы, а верхняя и нижняя кромки раздвинулись вплоть до верха и низа формы. Правая кромка элемента управления остается там, куда ее поместили.