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

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

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.

Распространенные элементы управления для представления данных

главы этой книги концентрируют внимание

Visual Studio поставляется более чем с 65 элементами управления и компонентами в Toolbox, которые вы можете добавлять к своим формам Windows простым перетаскиванием на поверхность разработки. Главы этой книги концентрируют внимание на таком использовании элементов управления для представления данных, когда они привязаны к источникам данных различного типа. Настоящий раздел охватывает наиболее распространенные элементы управления, которые вы будете использовать для представления данных, с привязкой или без привязки данных. Далее в одном из разделов будут показаны некоторые из замечательных новых элементов управления. NET 2.0, которые используются в приложениях обработки данных для целей, отличных от привязки данных. Основные главы книги углубляются во все детали привязанных к данным элементов управления, как тех, что существовали в. NET 1.x, но остаются жизнеспособными и сегодня, так и тех, которые появились в. NET 2.0. Поскольку все элементы управления Windows Forms производятся от базового класса Control, Они разделяют общий набор свойств, которые доступны в любом элементе управления. В их число входят такие свойства, как Font, BackColor, ForeColor И BorderStyle, Которые воздействуют на представление элемента управления; Position, Anchor И Dock, Которые влияют на расположение элемента управления; и Locked, Visible И Enabled, Которые влияют на то, может ли пользователь видеть или использовать элемент управления. Дальнейшие разделы описывают, каким образом вы располагаете элементы управления и устанавливаете их порядок табуляции, чтобы пользователь при помощи клавиши Tab мог передвигаться от одного элемента управления к другому в определенном порядке. Все описанные здесь элементы управления могут использоваться путем написания кода, работающего с их свойствами, методами и событиями. Вы также можете сделать с этими элементами управления почти все, что вам нужно, интерактивно через конструктор и окно свойств. Наконец, все эти элементы управления, кроме Listview И Treeview, Поддерживают также некоторую форму привязки данных через их свойства и внутренние возможности привязки данных Windows Forms.

Обработчик OnGetvisited Count для события Click

b если вы запустите приложение

Обработчик OnGetvisitedCount Для события Click Кнопки отображает диалог, показывающий число отображавшихся строк, которое определяется по состоянию коллекции M Visited. Если вы запустите приложение VirtualMode, то заметите несколько моментов, о которых стоит упомянуть. Первый касается того, что самое большое влияние на время выполнения оказывает время загрузки и кэширования на стороне клиента большой коллекции данных. Вследствие этого в реальном приложении вы, возможно, захотите выполнять такого рода операцию в отдельном потоке, чтобы не блокировать UI во время загрузки данных. Для этого можно было бы воспользоваться компонентом BackgroundWorker. Если при работе с большими объемами данных пользователь перетаскивает кнопку прокрутки, большое число строк на самом деле пропускается механизмами навигации и из-за задержек самой полосы прокрутки. В результате вам придется предоставлять лишь малый процент действительных значений ячеек, если только пользователь не прокручивает сетку слишком интенсивно. Вот почему виртуальный режим хорош для вычисляемых значений: можно избежать вычисления значений для ячеек, которые отображаться не будут.

Если вы запустите пример и немного поупражняетесь с прокруткой, а затем щелкнете на кнопке Get Visited Count, то увидите, сколько строк было загружено на самом деле. Я, например, запустил это приложение и прокрутил сетку сверху донизу несколько раз, довольно медленно. Я наблюдал по видимости плавную прокрутку, как будто я действительно проходил по всем миллионам строк, представленным в сетке. Однако как оказалось, в процессе прокрутки отображено было всего около 1000 строк.

Как быть, если вы захотите поддерживать редактирование значений непосредственно в сетке? Может быть, вы применяете виртуальный режим только для того, чтобы представлять вычисляемый столбец с относительно небольшим набором данных, и собираетесь использовать отредактированное значение в этом столбце для выполнения каких-то других вычислений или сохранить это значение. Есть еще одно событие, CellValuePushed, Которое запускается по завершении редактирования ячейки в сетке виртуального режима.