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

Событие CellFormatting

если вы хотите модифицировать действительное

Событие CellFormatting Запускается для каждой ячейки при ее отображении, что позволяет исследовать и, возможно, модифицировать значение, которое будет представлено в любой из ячеек сетки. Если вы хотите модифицировать действительное значение несвязанного столбца, которое сохраняется в коллекции ячеек сетки, используйте событие RowsAdded, Позволяющее установить сразу все значения несвязанных столбцов при добавлении строки, не обрабатывая события, запускаемые для каждой ячейки по отдельности. Если данные, которые вы представляете, являются исключительно вычисляемыми, а не извлекаются или выводятся из привязанных данных, следует рассмотреть возможность использования виртуального режима для заполнения этих ячеек, что будет рассмотрено в следующем разделе. Генерируйте вычисляемые столбцы там, где это имеет смысл Пример, представленный в этом разделе, просто генерировал новый столбец из содержания других столбцов. Если бы это требовалось делать исключительно в целях отображения, то использование несвязанного столбца могло быть наилучшим решением. Однако если содержимое этого столбца потребовалось бы в другом месте приложения, разумнее было бы включить его в состав данных вашего приложения, сделав специальным столбцом данных, который определяется выражением в самом наборе данных. Добавить к таблице типизированного набора данных специальный столбец довольно просто, если использовать конструктор наборов данных, причем имеется ряд специальных выражений для определения значений такого столбца по другим данным таблицы. Если вам требуется генерировать данные столбца, исходя из данных других таблиц в базе данных, будет еще разумнее сделать это в сохраняемой процедуре. Суть вышесказанного в том, что для вычисляемых данных следует выбирать подходящее место. Не используйте несвязанные столбцы в многократно повторяемом коде, чтобы отображать нечто такое, что можно было вы вычислить единственный раз и сделать действительным компонентом данных, с которыми вы работаете.

Верификация вверх по иерархии элементов управления

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

Класс ContainerControl Определяет метод Validate, Который верифицирует текущий элемент управления, обладающий фокусом, а затем пойдет вверх по иерархии элементов управления, верифицируя каждого из его предков. В случае типичной формы в стиле диалога каждый элемент управления является дочерним элементом формы, так что единственным предком каждого элемента управления будет сама форма. Сам по себе класс Form Ничего не делает в ответ на верификацию, поскольку непосредственно не содержит вводимых данных. Но если форма содержит другие контейнерные элементы управления, такие, как пользовательские элементы управления или расслоенные контейнеры, то непосредственным предком любого элемента управления, содержащегося в контейнере, будет этот контейнер, а предком контейнера будет форма. Метод Validate Часто использовался в приложениях. NET 1.1 для программной проверки того, что все элементы управления на форме находятся в действительном состоянии. Однако поскольку Validate Проверяет только текущий элемент управления в фокусе и его предков, для проверки нужно было итерировать по всем элементам управления в коллекции Controls Формы, устанавливая фокус на каждый из них и вызывая затем Validate. Такая методика была утомительной и проблематичной, поэтому требовался какой-то лучший подход. Вы как прежде можете вызывать Validate Для формы или элемента управления в фокусе, чтобы программно активировать верификацию, но обычно вы скорее всего предпочтете воспользоваться новым методом ValidateChildren.

Метод Validate Возвращает True, Если верификация успешна, что опять же определяется тем, устанавливает ли элемент управления в фокусе свойство Cancel Аргумента события в true. Если элемент управления в фокусе или любой элемент управления выше в иерархии говорит «нет», устанавливая свойство Cancel, То метод Validate Возвращает False, И ваш код должен принять соответствующие меры для оповещения пользователей о проблеме, и обычно вы захотите предотвратить продолжение работы, пока ошибка не будет исправлена.

Экземпляр строки данных

вы можете инкапсулировать расположение и

Экземпляр строки данных сам по себе не знает об экземпляре DataRowView, В который заключен, поэтому не существует способа перейти от строки данных к непосредственной ссылке на DataRowView, Однако трудно представить себе ситуацию, где это могло бы потребоваться.

Чтобы работать с нижележащими данными более свободно, вы можете обращаться к данным косвенно через источник привязки, при этом не будет необходимости в приведении к конкретному типу во время разработки. В классе BindingSource Имеется индексатор, так что вы можете передать индекс для доступа к определенному элементу и получить ссылку на объект: Вы можете обратиться к свойству List, Которое вернет вам ссылку типа IList. Затем вы можете просмотреть элементы коллекции последовательно или индексируя ее через ссылку на IList. Получив ссылку на объект любым из этих способов, вы можете воспользоваться дескрипторами свойств, чтобы получить информацию об объектах, обслуживаемых источником привязки, не зная их типов на этапе проектирования. Вы также можете использовать источник привязки, не привязывая его к конкретному источнику данных. Если для экземпляра источника привязки не был установлен источник данных, вы можете добавлять объекты непосредственно в список, поддерживаемый источником привязки. Для этого можно использовать методы Add И AddNew Класса BindingSource. Метод Add Вставляет элемент в поддерживаемый список. Если в список еще ничего не добавлялось , То первый добавленный элемент определит и тип объектов в List, Поддерживаемом источником привязки. Последующие попытки добавления элементов в список должны передавать объекты того же типа, в противном случае будет выброшено исключение InvalidOperationEx — Ception, Поскольку элементы в списке должны быть однотипными. Установка свойства DataSource Переустанавливает всю коллекцию любой новой коллекцией данных, на которую указывает новое значение свойства, что приводит к потере всех элементов, добавленных вручную при помощи метода Add.

Ячейки комбинированных полей

в режиме редактирования ячейка служит

Ячейки комбинированных полей поддерживают редактирование, причем пользователь может вводить значения с автозавершением либо выбирать значения в выпадающем списке. В режиме редактирования ячейка служит вместилищем для элемента управления, производного от ComboBox, так что она проявляет большинство из его функциональных возможностей. Свойство Value представляет текущее выбранное в комбинированном поле значение. Оно может содержать либо отображаемое в комбинированном поле текстовое значение, либо значение ValueMember, соответствующее выбранному элементу, в зависимости от того, что именно вы установили в свойствах DataSource, DisplayMember и ValueMember. Свойство Format — tedValue, унаследованное от базового класса, всегда содержит форматированный текст для выбранного элемента, отображаемого в комбинированном поле. Этот тип столбца содержит ячейки типа DataGridViewComboBoxSell, Который отображается в ячейке подобно стандартному элементу управления ComboBox. Это, безусловно, самый сложный встроенный тип столбца в DataGridView, И он экспонирует ряд свойств, управляющих его поведением, которые описываются в таблице 6.4. Истинно, если разрешено автозавершение в режиме редактирования ячейки, в противном случае ложно. Автозавершение позволяет пользователю вводить символы, а поле ищет им сопоставление среди элементов списка. Свойство допускает чтение и запись. Привязка к данным столбца этого типа или содержащихся в нем ячеек работает точно так же, как привязка к данным автономного элемента управления ComboBox. Вы устанавливаете свойства DataSource, DisplayMember и ValueMember, и элементы коллекции источника данных отображаются в выпадающем списке как значения компонента данных, указанного в качестве DisplayMember: В примерах кода к этой главе имеется простое приложение ColumnsTy — pes, демонстрирующее, каким образом происходит взаимодействие кода с каждым из описанных в главе встроенных типов столбцов

Событие DataError в DataGridview

данные поступающие в сетку могут

В элементе управления DataGridview Имеется много различных возможностей для появления каких-либо нарушений. Данные, поступающие в сетку, могут непосредственно вводиться пользователем, если вы разрешаете сетке поддерживать редактирование и добавление новых строк, а могут закулисным образом изменяться программно. У вас могут быть сложные типы ячеек, в которых будут какие-то ошибки при обработке или представлении значений. Те же самые индикаторы ошибки будут отображаться сеткой, когда ошибки возвращаются самим источником данных, а не устанавливаются непосредственно в строках или ячейках сетки. Ошибки источника данных обсуждаются далее в этой главе. Событие DataError Класса DataGridview Позволяет вам предусмотреть централизированный код для обработки ошибок многих различных типов, которые могут происходить во внутренних данных элемента управления или приходить из нижележащего источника данных. Событие передает аргумент типа DataGridviewDataErrorEventArgs, Который вместе с ошибкой несет пакет контекстной информации о ней. Тип аргумента события имеет свойства, показанные в таблице 10.1. Значение контекста может комбинироваться с одним из других флагов, если сетка может определить дополнительный контекст. Имеется много других тонкостей, которые могут приводить к неприятностям внутри сетки, когда она анализирует введенные значения и пытается поместить из в источник данных в качестве отредактированных значений. Здесь также может возбуждаться событие DataError, Которое позволит вам перехватить информацию и либо зарегистрировать ее, либо, возможно, обработать ситуацию в зависимости от аргумента контекста.