3. Общее представление о привязке данных в Windows Forms

Организация транзакций в System. Transact ions

net был разработан совершенно новый

В. NET 2.0 был разработан совершенно новый подход к написанию транзакционного кода, реализованный в пространстве имен System.Transactions. При помощи классов, определенных в этом пространстве имен, вы можете теперь в своем коде очень просто начинать или соединять транзакции, не привязываясь непосредственно к транзакционным возможностям базы данных или какого-то другого менеджера ресурсов транзакции. Транзакции, создаваемые посредством классов System.Transactions, Могут быть как облегченными транзакциями с единственным менеджером ресурсов, таким, как одиночная база данных SQL Server 2005, так и распределенными транзакциями, в который участвует несколько менеджеров ресурсов, как в базе данных SQL 2000, базе данных Oracle и очереди сообщений MSMQ. Другой замечательной особенностью новых транзакционных средств является то, что транзакция будет автоматически переводить себя из облегченной транзакции в распределенную, если она видит, что в области действия транзакции происходит обращение к новому менеджеру ресурсов, который требует распределенной транзакции, поэтому вам не нужно беспокоиться в своем коде относительно корректного использования различных моделей. Чтобы использовать System.Transactions, Вы прежде всего должны добавить в свой проект ссылку на сборку System. Transactions. dll из. NET Framework. Затем нужно включить пространство имен System.Transactions В файлы кода, где вы будете его использовать. Когда вам нужно будет исполнить некоторый код внутри транзакции, вы устанавливаете транзакционную область действия, создавая экземпляр класса Transac — TionScope. Затем вы исполняете код, который должен быть транзакционным, и если все проходит успешно, вызываете метод Complete Объекта TransactionScope. Транзакция на самом деле не будет зафиксирована до тех пор, пока вы не уничтожите объект области действия, а если вызвать Dispose Без предварительного вызова Complete Объекта области действия, транзакция будет прервана.

Проще всего проделать все это в C# при помощи блока Using. Когда вы организуете блок Using В С#, вы передаете предложению Using Объектную ссылку, являющуюся уничтожаемым объектом. Когда происходит выход из блока Using, Для объекта автоматически будет вызван Dispose, Даже если транслируется исключение. Это происходит потому, что генерируемый компилятором код для блока Using Включает блок Try-Finally, И в блоке Finally Вызывается Dispose Для аргумента предложения Using.

Разработка ASP. NET

net то знаете что все

Если вы занимались какими-либо разработками ASP. NET, то знаете, что все эти виды верификации охватываются набором серверных верифицирующих элементов управления, которые вы можете поместить на Web-страницу для выполнения верификации других элементов управления на странице. BASP. NET входят RequiredFieldValidator, CompareValidator, RangeVali — Dator И RegularExpressionValidator, Обеспечивающие четыре вида верификации, описанные выше. Имеется еще элемент управления ValidationSum — Mary, Который позволя2ет отображать все сообщения об ошибках, вызванные неудачными результатами верификации, в одном месте страницы, избавляя от необходимости выделять место для каждого элемента управления, где отображалась бы информация об ошибке. К сожалению, в Windows Forms нет аналогичных готовых элементов управления. Билли Холлисом и Майклом Вайнхардтом было написано несколько превосходных статей, описывающих методики расширения возможностей верификации в. NET 1.1. Многое из того, о чем там говорилось, приложимо и в. NET 2.0, например, о создании дополнительных элементов управления или компонентов, упрощающих процесс верификации ввода от элементов управления в Windows Forms. В своей статье в «MSDN Online» Билли Холлис описывает подход, связанный с созданием провайдера расширения, охватывающего все четыре вышеупомянутые формы верификации.

Майкл Вайнхардт в своей серии из трех статей применяет другой подход и использует классы, производные от Component, Для создания отдельных элементов управления, поддерживающих каждую из четырех форм верификации, а также предусматривает механизм для централизованной верификации элементов управления на форме. Подход, описанный во 2-й и 3-й частях статьи Вайнхардта, несколько устарел из-за появления в. NET 2.0 метода Validatechildren И свойства AutoValidate.

Хранение в базе данных графического изображения

b для представления этого изображения

Например, при хранении в базе данных графического изображения обычно сохраняют сырые байты графического файла или объекта в столбце Image. Для представления этого изображения вам требуется трансформировать его в тот тип изображения, который совместим с возможностями ваших элементов управления. Вам может также потребоваться модифицировать графические данные перед их представлением, например, масштабировать изображение. Если речь идет о датах или о числах с плавающей точкой, база данных может хранить их с более высокой точностью, чем требуется вам, и опять возникает нужда в преобразовании. Наконец, в столбце вашей таблицы может содержаться внешний ключ, и вместо отображения значения ключа вам потребуется отображать соответствующее значение, извлеченное из столбца родительской таблицы. Например, если вы отображаете список заказов, нужно отображать имя клиента вместо его идентификатора. В столбцах базы данных могут содержаться значения Null Для столбцов, которые транслируются в типы значений системы типов. NET, но поскольку типы значений никогда не могут быть нулевыми, что случится, если вы попытаетесь привязать данные из такого столбца к свойству элемента управления, определяющему тип значения? Ответ на этот вопрос зависит от устройства элемента управления, и хорошо спроектированный элемент управления корректно обработает нулевое значение, и кроме того, будет документировано, каким будет его поведение. Примеры того, как контролировать это поведение, вы встретите в следующих разделах. Во всех таких случаях есть простой способ найти решение, если вы знаете, где его искать. В главе 6 подобные ситуации подробно описываются на примере элемента управления DataGridView. В данном разделе мы рассмотрим привязку данных сложных типов к отдельным свойствам элемента управления. Ключевая роль здесь принадлежит пониманию работы класса Binding, Тому, как этот класс контролирует процесс привязки данных. В листинге 3.4 объект Binding Создавался и добавлялся к коллекции DataBindings Текстового поля неявно благодаря перегрузке метода Add В этой коллекции:

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

этот класс является оболочкой элемента

Элемент управления Listview Довольно сложен и позволяет вам представлять коллекцию информации в нескольких различных видах. Этот класс является оболочкой элемента управления операционной системы, который использует Windows Explorer, где вы можете переключаться между видами малых значков, больших значков, таблицы и списка тех элементов, которые он содержит. Чтобы заполнить элементу управления элементами для отображения, вы должны конструировать экземпляры класса Listviewitem. Этот класс представляет собой контейнер данных для каждого элемента, позволяя вам специфицировать текст элемента и изображение, которое будет использовано для отображения больших и малых значков. Вы можете также ассоциировать с элементом коллекцию субэлементов, и эти субэлементы будут использоваться для отображения табличного вида Listview. Элемент управления не поддерживает никакой непосредственной привязки данных, поскольку корректное конструирование объектов Listviewitem Не может естественным и обобщенным образом быть сопоставлено с реляционным набором данных. Элемент управления TreeView Позволяет вам отобразить иерархический управляемый вид данных в своем приложении. Вид дерева представляет коллекцию узлов примерно таким же образом, как вид папок в левой панели Windows Explorer. Каждый узел дерева является объектом типа TreeNode, Который имеет свойства Image И Text, Определяющие, что будет отображаться для узла. Вы можете специфицировать, отображать ли линии между узлами, отображать ли рядом с каждым узлом значки плюс/минус для развертывания дерева и поля флажков для выбора нескольких узлов. Как и Listview, Элемент управления TreeView Не поддерживает непосредственно привязку данных, поскольку не существует естественного отображения реляционных данных на древовидную структуру.

Пути к данным в источниках

объект верхнего уровня играет роль

Источники данных, участвующие в привязке данных Windows Forms, рассматриваются как иерархические. Объект верхнего уровня играет роль контейнера для коллекций данных, а сами коллекции являются контейнерами для отдельных элементов данных. Каждый элемент данных, в свою очередь, содержит значения для свойств объекта. Источник данных может быть устроен и проще: это может быть объект, содержащий свойства, или это может быть простой массив объектов. При работе с произвольными коллекциями объектов, играющими роль источников данных, уровни иерархии могут спускаться сколь угодно глубоко. У вас есть объект верхнего уровня, Company, Который содержит коллекцию Employees; Каждый объект Employee Может содержать коллекции Jobs, Tasks И Contacts, А также элементы данных, специфичные для Employee; А каждая из дочерних коллекций может содержать или другие коллекции, или собственно элементы данных. Чтобы справляться с со всеми такими ситуациями, источники данных рассматриваются как иерархии, а для спецификации источников и элементов данных используется синтаксис путей. Тем самы обеспечивается точная спецификация местоположения требуемого элемента в иерархии.

Когда я привязывал элементы управления TextBox К источнику данных в листинге 3.4, я указал в качестве источника данных таблицу Customers В составе набора данных, а затем указывал компонент данных, как имя столбца в этой таблице. В качестве источника можно установить сам набор данных, а не содержащуюся в нем таблицу. Но в этом случае нужно будет по-другому специфицировать компонент данных, поскольку компонент данных представляет собой относительный путь внутри иерархии источника данных к конкретному объекту или значению, подлежащему привязке.

Этот альтернативный подход к спецификации привязки данных для текстового поля иллюстрируется кодом листинга 3.5.