2. Работа с наборами типизированных данных

Откатывайте транзакции явным образом

однако я рекомендую вам всегда

Если вы закрываете соединение, на котором начали транзакцию, и еще не вызвали для нее Commit, Произойдет автоматический откат транзакции. Однако я рекомендую вам всегда делать это явным образом, самостоятельно вызывая Rollback , Чтобы было ясно, где и когда происходит откат Поскольку соединение открывается в листинге Г.9 явным образом, в дополнение к Try-Cach, Как вы можете видеть, я обеспечил его закрытие в блоке Finally, Поэтому, что бы ни происходило, соединение будет закрыто перед тем, как я выйду из метода. Вы видите здесь еще пару моментов, которые еще не обсуждались — это методы ExecuteScalar И ExecuteNon — Query Объектов SqlCommand. Метод ExecuteScalar Удобен для запросов, которые возвращают в качестве результирующего набора единственную строку с единственным столбцом. Метод извлекает значение этого столбца и передает его в качестве своего возвращаемого значения. Оно возвращается как объектная ссылка, поэтому необходимо приведение к ожидаемому типу, как показано в листинге Г.9. Метод ExecuteNonQuery Предназначен для исполнения команд, от которых вы не ожидаете каких-либо возвращаемых строк, таких, как запросы обновления, удаления и вставки. Когда транзакция создана, вам нужно ассоциировать ее с любыми командами, которые вы собираетесь применять внутри области действия транзакции. После этого вы можете исполнять команды. Если все получится так, как вы ожидаете, вы должны вызвать Commit Для объекта транзакции, чтобы сделать постоянными все изменения, произведенные внутри транзакции. Если что-то происходит не так, вы должны вызвать Rollback Транзакции, чтобы предотвратить запись любых изменений, сделанных командами внутри нее. Наилучшим способом обеспечить такую модель поведения является блок Try-Catch, Как показано в листинге Г.9. Если вы в своем коде явно открываете соединение, всегда заключайте код, который открывает соединение и исполняет запросы, в Try-блок. За ним расположите блок Finally И в нем закройте соединение. Тогда, завершается ли метод нормально или в результате неперехваченного исключения, соединение все равно будет закрыто и освобождено для использования другими клиентами.

Элементы управления ComboBox

помимо способа отображения списка и

Элемент управления ComboBox Представляет список данных в виде выпадающего списка с текстовым полем, которое может использоваться либо для отражения текущего выбора, либо для того, чтобы позволить пользователю ввести новое значение. Помимо способа отображения списка и того факта, что вы можете сделать текущее выбранное значение редактируемым, элемент управления работает во много м подобно полю списка с единственным выбором, но занимает на экране гораздо меньше места. Как и поле списка, он поддерживает в свойстве Items Список элементов типа ComboBox.ObjectCollection, Который он использует для отображения списка и который вы можете при желании использовать для хранения более сложных объектов, чем просто текстовые строки. Будет ли текущий выбор редактируемым, определяется установкой свойства DropDownStyle. Как и в случае поля списка, вы при необходимости можете обрабатывать событие SelectedlndexChanged. В этом методе вы могли бы возвращать для представления в списке или других элементах управления имя заказчика, но определение класса Customer Могло бы содержать элементы для ID и любых других ассоциированных данных, которые нужны для обработки выбора заказчика. В тот момент, когда вам потребуется произвести эту обработку, вы можете определить текущий выбор из свойства Selectedltem, Которое возвращает ссылку на соответствующий объект Customer. Так как Selectedltem Имеет тип Object, Для доступа к действительной информации объекта вам потребуется привести эту ссылку к ожидаемому типу. Следующий код показывает это в действии для дочернего элемента управления ListBox На форме с именем M_CustomersListBox: Вы можете отслеживать изменения выбора элементов в списке при помощи события SelectedlndexChanged. Когда вы обрабатываете это событие, вы можете использовать свойство Selectedlndex, Чтобы получить индекс в списке для одиночного выбора, либо свойства Selectedltem Или Selectedltems, Чтобы получить объектную ссылку на выбранные элементы в списке. Свойство Selectedltems Используется в случае, если вы разрешаете выбор нескольких элементов в поле списка, устанавливая свойство SelectionMode Равным MultiSimple Или MultiExtended.

Элементы управления Label

многие элементы управления предоставляют информацию

Метки являются простым, но важным для ваших форм элементом управления. Многие элементы управления предоставляют информацию о своем назначении в самом своем представлении, но другие нуждаются во внешних средствах, чтобы сообщить пользователю о том, что с ними делать. Метки являются в точности тем, чем они называются: простым элементом управления, который может содержать метку, чтобы показать пользователю некоторую единицу информации. Этой единицей информации чаще всего является текст, который указывает название, содержание или назначение другого элемента управления на форме. Однако метка может также содержать изображение. Но если вашей основной целью является представление изображения пользователю, то следует использовать элемент управления PictureBox, Поскольку он обладает гораздо более развитыми функциями для представления изображения.

Обычно вы просто перетаскиваете метку на форму, а затем устанавливаете в ее свойстве Text, При помощи окна свойств или программно, все, что вы хотите в ней отображать. Если вы работаете в представлении Code, то должны также установить для метки имя элемента управления, чтобы было ясно, где какая метка. Порядок табуляции для метки вы должны установить так, чтобы она непосредственно предшествовала элементу управления, на который ссылается, чтобы помочь пользователям с ограниченной способностью восприятия, пользующимся специальными возможностями Windows, получить доступ к функциям вашего приложения. Кнопка несомненно является одним из самых распространенных элементов управления в интерактивных приложениях. Класс Button Представляет на ваших формах стандартную кнопку Windows, которая может использоваться в вашем приложении для запуска действий или активации логики обработки. Чтобы использовать кнопку, вы опять же обычно перетаскиваете ее на форму, устанавливаете в свойстве Text То, что вы хотите отображать на лицевой поверхности кнопки, и создаете обработчик для события Click, Чтобы производить в нем любую необходимую обработку. Для кнопок Windows Forms можно также устанавливать изображение, которое будет отображаться на лицевой поверхности кнопки в дополнение к тексту или вместо него.

Метод DumpList

обычно списки с которыми вы

Метод DumpList Использует класс TypeDescriptor , чтобы получить коллекцию дескрипторов свойств для одного из элементов коллекции. Обычно списки, с которыми вы имеете дело, являются гомогенными коллекциями объектов; в противном случае вы вряд ли вообще сможете к ним привязаться. Следовательно, достаточно получить дескрипторы свойств единственный раз для одного из объектов в коллекции. При помощи этих дескрипторов потребляющий код может выводить имя и значение каждого объекта данных по ходу итерации списка в цикле Foreach . Заметьте, что этот метод не имеет никакой конкретной информации о типах относительно списка или его элементов данных, помимо той, что коллекция представлена интерфейсной ссылкой типа IBindingList. После распечатки сырого списка код использует ссылку IBindingList Для проверки того, поддерживает ли коллекция сортировку. Если поддерживает, программа входит в блок кода, применяющего сортировки. Сначала код использует интерфейсную ссылку ITypedList, Чтобы методом GetltemProperties Получить дескрипторы свойств для столбцов псевдотаблицы. Затем при помощи дескрипторов для первого и второго столбцов к ним применяется сортировка соответственно в восходящем и нисходящем порядке. После применения каждой сортировки снова вызывается DumpList, Чтобы показать, что порядок итерации действительно изменился в соответствии с применявшейся сортировкой. Наконец, вызывается RemoveSort, Чтобы продемонстрировать восстановление исходного порядка. Если вы запустите этот пример, то в его выводе увидите следующие результаты сортировки: Этот пример демонстрирует, что сортировка модифицирует порядок, в котором список возвращает свои элементы при итерации. Если вы создаете свой собственный тип объектной коллекции, то способ применения сортировки оставляется на ваше усмотрение, но обычно эффективная поддержка сортировки нетривиальна. Метод RemoveSort Удаляет текущую сортировку. Проверить, сортирована ли коллекция, можно при помощи свойства IsSorted. Можно также получить направление сортировки и свойство при помощи соответственно свойств SortDirection И SortPro — Perty

Представление табличных данных в сетке

когда заказчик выбран сверху на

В качестве простого примера предположим, что вы хотите представить на странице таблицу заказчиков, чтобы можно было выбрать заказчика из списка. Когда заказчик выбран, сверху на странице должно отображаться название его компании. Реализующий данную задачу код показан в листингах А.1 и А.2. Запущенное приложение показано на рис. А.1 . Web-форма ASP. NET всегда содержит код HTML, в соответствии со стандартом HTML для Web-страниц размечающий элементы заголовка и тела. Каждая Web-форма должна иметь единственный элемент формы, который содержит всю специфическую разметку ASP. NET. Внутри этого элемента формы другие теги разметки определяют элементы управления, из которых составляется страница, а также атрибуты или дочерние элементы этих тегов, которые управляют их поведением при отображении в браузере. Теги разметки могут перемежаться со встроенным сценарием любого объема в различных формах блоков сценария. Из кода в листинге А.1 видно, что здесь объявляются три элемента управления ASP. NET — две метки Label И сетка DataGrid. Каждый тег снабжен префиксом asp:, привязывающий имя тега к именному пространству, в котором определяются элементы управления Web-сервера. Каждый из них имеет также атрибуты Id И Runat="Server". Атрибут Id Используется для соотнесения тега с элементом управления во время исполнения, a Runat Идентифицирует элемент управления как серверный, экземпляр которого будет создаваться и вызываться во время обработки страницы на сервере. Сложные элементы управления, подобные DataGrid, Имеют усложненную схему допустимых дочерних атрибутов и элементов, которые позволяют настроить их поведение при отображении во время исполнения. Значения любых свойств, которые экспонируются классом элемента управления как открытые или закрытые, могут также устанавливаться в разметке посредством спецификации этих свойств в качестве атрибутов тега разметки данного элемента управления. В элементе DataGrid В листинге А.1 в качестве дочернего элемента коллекции Columns Специфицируется единственный элемент управления столбца типа ButtonColumn. Дополнительные колонки здесь будут добавляться динамически, когда сетка будет привязываться к данным.