5. Общее представление об интерфейсах привязки данных

Ваше первое приложение Windows Forms для данных

я объясню шаги создания приложения

Первое приложение поведет вас на один шаг дальше обычного «Hello world»; вы создадите очень простое приложение, которое загружает некоторые данные и отображает их в сетке. Я объясню шаги создания приложения с чисто программной точки зрения, а в следующем разделе вы повторите его создание, используя Windows Forms. Таким образом вы получите представление как о том, что происходит за кулисами, так и о том, как это делается быстро и просто при помощи конструктора Visual Studio. Затем мы углубимся в то, что происходит за кулисами, чтобы вы поняли, откуда берутся все функциональные возможности Windows Forms. Итак, давайте начнем с чисто программного подхода.

Метод Main Является входной точкой любого приложения. NET. В Visual Studio 2003 он всегда помещался в первый класс Form, Добавляемый к проекту. В Visual Studio 2005 к проекту добавляется класс Program В качестве отдельного файла кода, чтобы метод Main Не потерялся при удалении из проекта первой формы. Мы следуем здесь тому же подходу, но для простоты просто разместили этот класс в том же файле. Атрибут необходим, если приложение будет использовать какие-либо элементы управления ActiveX, буфер обмена или какие-либо COM-объекты в однопоточном разделе, поэтому в Visual Studio он по умолчанию добавляется к любым проектам приложения Windows, и, как правило, он всегда вам потребуется. Чтобы сделать доступным этот тип атрибута, вы должны подключить оператором Using Пространство имен System. Чтобы компилировать этот файл при помощи компилятора C# с командной строкой, откройте окно командной строки Visual Studio в группе Microsoft Visual Studio, подменю Visual Studio Tools), перейдите в папку, где находится файл, и введите команду:

NET Framework имеется ряд встроенных типов объектных коллекций

net framework имеется ряд встроенных

В. NET Framework имеется ряд встроенных типов объектных коллекций, и вы сами можете создавать свои собственные типы коллекций, если вам нужно, чтобы коллекция поддерживала возможности, не предусматриваемые доступными типами коллекций. До. NET 2.0 потребность в создании специальных коллекций возникала достаточно часто, если вам хотелось иметь безопасные по типам коллекции данных или рабочих объектов. С введением обобщений в. NET 2.0 необходимость реализации специальных классов коллекций будет весьма редкой. Классы List<T>, Dictiona — Ry<T>, Queue<T>, Stack<T>, LinkedList<T> И SortedDictionary<T> Должны быть достаточны для большинства ситуаций, когда вы захотите реализовать специальную сильно типизированную коллекцию объектов. Кроме того, в Widows Forms имеется класс BindingList<T> Для привязки данных, реализующий большинство интерфейсов, которые вам потребуются. Подробно BindingList<T> Рассматривается в главе 9, но вы уже видели его в действии во многих примерах из предыдущих глав. Учитывая все вышесказанное, существует потенциально неограниченное число типов коллекций и объектов, доступных для привязки данных в ваших приложениях. Так каким же образом вы можете охватить все это разнообразие? Это делается путем определения общего контракта, поддерживаемого всеми типами, которые должны совместно участвовать в привязке данных. Наилучшим средством спецификации контракта для кода, не замкнутого на реализацию этого контакта, является интерфейс. Определения интерфейсов должны рассматриваться с двух точек зрения: с точки зрения реализатора и с точки зрения потребителя. Реализатором является класс, в котором предусмотрена реализация элементов, определенных в интерфейсе. Потребителем является код, который получает ссылку на интерфейс объекта и активирует через нее функции, предоставляемые этим интерфейсом.

Обзор программирования пользовательских интерфейсов и возможностей WinFx

это касается подхода к целевым

WinFx вводит ряд новых концепций и подходов к программированию приложений с интерфейсом пользователя для Windows. Это касается подхода к целевым дисплейным устройствам и отображению графики, программирования элементов UI и нового декларативного языка для спецификации UI-приложений. Прежде всего WinFx пытается уйти от ориентированной на пикселы программной модели низкоуровневой графики, отображаемой на рабочем столе пользователя. Существующие дисплеи способны передавать изображения с невероятным разрешением. Если при отображении на дисплее элементов UI исходить из их размеров в пикселах, как это обычно и делается сегодня в приложениях Windows, то при запуске приложений вы получите для различных устройств и дисплеев огромный разброс в размерах элементов UI. Хотя сегодня в GDI и GDI+ существуют способы преобразования размеров в логические единицы, первичная программная модель ориентирована на пикселы. В WinFx модель обратная; первичные вызовы API для графических операций ориентированы на логические единицы. Кроме того, сегодняшний подход к отображению графики в Windows основан на растровых операциях — отображении элементов на дисплее как матриц из пикселов. Но большинство рисуемых объектов представляют собой геометрические фигуры, такие, как прямоугольники и кривые, которые проще отображать посредством векторной графики. WinFx делает векторную графику, как таковую, первичной низкоуровневой методикой рисования. При этом становится значительно проще выводить, например, на экран элементы UI и затем выполнять над ними преобразования — вращать, масштабировать или перемещать. Это делает программирование анимационных эффектов гораздо более простым и естественным.

Вездесущий DataSet

привязка данных к специальным объектам

Наиболее частым типом данных, с которым вы будете иметь дело в привязке данных Windows Forms, является DataSet. Привязка данных к специальным объектам и коллекциям в. NET 2.0 также очень проста, поэтому это также будет весьма распространенным подходом, который более подробно описывается в различных местах этой книги. Но наборы данных специально предназначены для привязки данных в. NET, а это приложение фокусирует внимание на реляционном доступе к данным, поэтому прежде всего мы займемся именно ими. По существу набор данных предоставляет вам коллекцию данных в памяти, которая может использоваться для хранения чего угодно, начиная от единственной строки данных до сложных схем из нескольких таблиц с отношениями и ограничениями между ними. Некоторые могли бы зайти даже так далеко, чтобы назвать их базами данных в памяти, но здесь существует та опасность, что при таком образе мыслей можно начать накапливать в памяти слишком много данных. Рис. Г.1 показывает структуру набора данных и объекты, которые содержатся внутри него. В случае простого табличного доступа к данным, полученным от запроса, вы обычно будете иметь дело с единственной таблицей в наборе данных, который будет целью вашей привязки данных. При этом набор данных становится просто красивой оберткой для набора строк. На самом деле вы могли бы просто создать таблицу данных и заполнить ее, и. NET 2.0 позволяет вам создавать самостоятельные объекты DataTable, Без охватывающего их набора данных. Существует также много сценариев, где вам может потребоваться извлекать строки из таблицы, которые находятся в родительско-дочерних отношениях со строками из другой таблицы. В таких случаях вы будете работать с наборами данных, содержащими несколько объектов таблиц данных, один или несколько объектов отношений данных, которые поддерживают родительско-дочерние отношения между таблицами, и объекты ограничений, обеспечивающие целостность содержащихся данных. Объект таблицы данных содержит коллекцию столбцов данных, которые описывают имя и тип каждого столбца в таблице, а также содержит коллекцию объектов строк данных, которые содержат собственно действительные данные.

Установка свойства DataSource

например вы можете получить отфильтрованный

Теперь все, что потребуется для одновременного изменения привязки всех элементов управления — это установка свойства DataSource Объекта источника привязки, при этом все привязанные к нему элементы управления автоматически переключатся на новый источник данных. Например, вы можете получить отфильтрованный список клиентов из уровня доступа к данным и захотите привязать этот новый список к тому же набору элементов управления. Для подобной динамической смены источника необходимо, чтобы форма нового источника данных должна быть той же, что и у исходного источника. Например, вспомогательный метод AddTextBoxDataBindings Для каждого текстового поля добавляет привязку данных к столбцам CompanyName, ContactName И т. д. Если вы в качестве источника данных для источника привязки установите вместо коллекции клиентов коллекцию заказов, все эти привязки окажутся нарушенными — в новой коллекции элементов данных они не смогут найти привязанные свойства и поэтому будут выбрасывать исключения. На протяжении всей книги я буду более глубоко рассматривать разнообразные ситуации в сценариях привязки данных, где вступает в игру компонент BindingSource. Как правило, следует всегда между элементами управления и источниками данных располагать источники привязки, даже если вы не собираетесь динамически менять источник во время выполнения. Компонент BindingSource Предусматривает также средства для управления текущей записью в источнике данных, а также может возбуждать события, позволяющие отслеживать изменения в источнике данных.