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

Динамическое определение свойств источника данных

когда вы создаете специальные элементы

Следующем требованием к фильтрующей сетке, которым мы займемся, будет возможность динамического заполнения комбинированного поля M ComboBox В элементе управления FilteredGrid Именами столбцов или свойств элементов данных в привязанном источнике данных. Когда вы создаете специальные элементы управления, которые, как этот, поддерживают привязку данных, вы должны по возможности не делать никаких предположений о действительных типах данных, привязываемых к вашему элементу управления. Например, один из путей решения обсуждаемой задачи — это сказать, что ваш элемент управления можно будет привязывать только к объектам DataTable , И поэтому вам достаточно просто привести DataSource К типу DataTable, Обратиться к его коллекции Columns И получить имена столбцов из объектов DataColumn Этой коллекции. Проблема такого подхода в том, что никто просто не сможет использовать ваш элемент управления с коллекцией специальных рабочих объектов, что является случаем применения, который вы должны поддерживать точно так же, как его поддерживают привязанные к данным элементы управления из Framework. Поскольку привязанная к данным часть вашего элемента управления состоит из сетки и источника привязки, заботу о деталях привязки к разнообразным коллекциям данных можно предоставить источнику привязки, с чем он прекрасно и справляется. Однако у вас должна быть возможность заглянуть внутрь любой коллекции, привязанной к источнику привязки, и определить имена столбцов или свойств каждого из элементов данных в коллекции, причем это нужно сделать таким образом, чтобы о типе объекта ничего заранее не предполагалось. Является ли источник данных набором данных, таблицей данных или коллекцией рабочих объектов, ваш код должен обращаться с ним соответственно, желательно без написания множества условных проверок, выясняющих принадлежность к определенным типам. К счастью, Framework предусматривает поддержку именно для этого в форме дескрипторов свойств. Воспользовавшись статическим методом GetProperties Класса TypeDescriptor, Можно получить экземпляр Proper TyDescriptorCol Lection, Содержащий дескрипторы для всех свойств объекта вне зависимости от того, является ли он строкой в таблице или же экземпляром рабочего объекта.

Контекстная вкладка элемента управления

вы можете также перетаскивать их

Когда вы поместили элементы управления на форму, вы можете перетаскивать их мышью, чтобы изменить их расположение на форме. Вы можете также перетаскивать их углы или кромки, чтобы желаемым образом изменить их размер. Обратите внимание, что когда вы перетаскиваете элемент управления, появляются линии привязки, чтобы помочь вам выровнять перетаскиваемый элемент управления с другими элементами управления на форме. Эти тонкие синие и пурпурные линии протягиваются между перетаскиваемым элементом управления и другими элементами либо кромками формы. Они помогают вам точно выровнять верх, низ и боковые стороны элементов управления, также как и базовую линию текста в элементах управления. Когда вы подобным образом перетаскиваете элементы управления или компоненты на форме, вы в действительности объявляете и инициализируете элементы-переменные класса формы, используя визуальное представление этих операций. Вскоре вы увидите генерируемый при этом код, но окончательный результат очень похож на то, что вы закодировали в предыдущем разделе вручную. 1. Выберите в окне Toolbox группу Data, чтобы отобразить палитру компонентов данных. Перетащите на форму компонент DataSet, После чего появится диалог, позволяющий настроить вид набора данных, который будет добавлен. Для настоящего примера выберите Untyped Dataset, и к форме будет добавлен элемент набора данных.

Он отображается в нижней части конструктора в лотке компонентов, и его именем по умолчанию является DataSetl. Все компоненты, которые добавляются посредством конструктора и не имеют графического представления времени выполнения, помещаются в лоток компонентов. Это позволяет вам все равно выбирать их и оперировать любыми характеристиками времени проектирования, которыми они обладают, а также устанавливать их свойства в окне Properties. Установите свойства элементов управления, которые вы создали путем сбрасывания их на форму. Некоторые из свойств устанавливаются конструктором автоматически в зависимости от ваших манипуляций с элементом управления, например, свойства Size И Location. Если окно Properties не отображается в IDE, сделайте его видимым, выбрав Properties Window в меню View или нажав F4.

Простое приложение WinFx

корень иерархии типов для пользовательских

Чтобы начать программировать приложения WinFx, вам следует освоиться с некоторыми объектными типами, которые вы будете использовать при создании приложения. Корень иерархии типов для пользовательских интерфейсов WinFx находится в пространстве имен System.Windows . На верхнем уровне находится объект Application, Сходный с объектом приложения в Windows Forms, но определяемый как отдельный тип в пространстве имен System.Windows. Имеется несколько производных классов приложения, специализированных для различных видов приложений, например, класс NavigationApplication, С которым вы встретитесь в одном из дальнейших примеров. В рамках приложения вы создаете объекты System.Windows. Window, Которые будут содержать страницы и элементы управления, образующие его пользовательский интерфейс. Элементы управления собраны в иерархию, называемую визуальным деревом, где любой отдельный элемент может отображать свою собственную область клиента, содержать другие элементы управления, делать и то, и другое или не отображать ничего. Такая концепция открывает очень гибкий и мощный подход к объявлению и построению пользовательского интерфейса, поскольку вы фактически можете расширять функции элемента управления, придавая ему различное содержание. Например, в Windows Forms класс Button Позволяет вам добавлять к формам кнопки, которые могут содержать текстовую подсказку, изображение или и то, и другое. Вы задаете, что будет содержать кнопка, устанавливая явные свойства класса для тех визуальных элементов, которые поддерживаются данным элементом управления при отображении его области клиента. В случае кнопки WinFx, как и многих других элементов управления, вы можете добавлять к кнопке дочерние элементы произвольной сложности, и каждый из них будет вызываться для отображения своей собственной области клиента. Посредством задания стилей вы можете динамически определять элементы содержания и устанавливать свойства, воздействующие на их внешний вид и поведение.

Область клиента

текст это то что будет

Область клиента начинается сразу под линейкой заголовка и внутри границы, нарисованной вокруг окна. Текст — это то, что будет показано на лицевой поверхности кнопки при ее отображении на форме. Для этой кнопки подойдет размер по умолчанию, поскольку текст короткий. Если вам нужно будет специфицировать для текста кнопки более длинные строки, вы должны будете настроить размер кнопки, чтобы он соответствовал тексту, или, еще лучше, установить в True Свойство AutoSize.

Для сетки вы создаете ее экземпляр, задавая как размер, так и положение, чтобы поместить ее под кнопкой, но внутри границ формы. На самом деле существует множество различных опций для расположения элементов управления на форме, и сетка сама по себе очень сложный тип. Но она хорошо спроектирована, так что для простых применений вам потребуется всего несколько строчек кода. Как только все элементы управления созданы и их свойства установлены, вы добавляете их к коллекции Controls Формы при помощи метода Add Класса коллекции. Это делает их дочерними элементами управления на форме. Когда форма отображается, она перебирает список дочерних элементов управления, давая каждому из них команду нарисовать себя на форме, используя свои свойства и встроенное поведение рисования. Каждый элемент управления инкапсулирует свои собственные состояние и поведение, относящиеся как к характеру и способу своего рисования, так и событиям, которые он будет запускать в процессе взаимодействия с пользователем или системой. Когда вы снова компилируете и запустите из командной строки это приложение, то получите форму побольше с кнопкой и пустой сеткой на ее поверхности. Для окончательной модификации этого примера вам потребуется добавить обработчик для события Click Кнопки, загрузить в этом обработчике некоторые данные и привязать их к сетке.

Командная строка Visual Studio

теперь у вас должен быть

Имейте в виду, что если вы не используете командную строку Visual Studio, то вас должны быть установлены соответствующие переменные среды, позволяющие Windows найти компилятор командной строки. Теперь у вас должен быть файл DataAppForm. exe, который вы можете запустить. Если вы это сделаете, то получите пустое квадратное окно. Это довольно скучно, поэтому давайте добавим к форме сетку и кнопку. Листинг В.1 показывает изменения в классе, которые потребуются для того, чтобы добавить кнопку и сетку и разумным образом расположить их.

Код в листинге B. l несколько более сложен, поэтому давайте разберем его последовательно. Прежде всего вам потребуется дополнительное пространство имен System.Drawing Для классов Size И Point, Которые используются для спецификации положения и размера каждого из элементов управления, добавляемых к форме в качестве дочерних элементов. В дан-ном случае вы добавляете элементы Button И DataGridView, Определенные как классы элементов управления в пространстве имен System.Windows. Forms. Затем в конструкторе класса вы создаете экземпляры этих элементов, устанавливаете для них необходимые свойства, после чего добавляете их к коллекции дочерних элементов управления, которую хранит форма.

Для формы вы изменяете ее размер, обращаясь к свойству Size Базового класса Form И устанавливая его равным 500 на 400 пиксел. Затем вы создаете экземпляр класса Button И устанавливаете положение и текст кнопки. Специфицируемое положение указывается относительно верхней левой части клиентской области формы, с положительными значениями по оси х, возрастающими вправо, и положительными значениями по оси у, возрастающими вниз.