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

Набор данных и адаптер данных

каждый объект b datarow b

Набор данных и адаптер данных поддерживают и такой сценарий. Каждый объект DataRow В таблицах набора данных содержит коллекцию ошибок, экспонируемую в свойстве Errors. Если при выполнении обновления для строки возникает ошибка, выброшенное исключение заполнит коллекцию ошибок информацией о том, что произошло. Сюда могут входить не только исключения конкуренции, но и другие встроенные или специальные ошибки SQL Server, возбуждаемые при исполнении запроса или сохраняемой процедуры. Вы можете установить в True Свойство ContinueUp — DateOnError Адаптера данных, и тогда, если при обработке строки выбрасываются какие-либо исключения, будет заполнена коллекция ошибок этой строки, но обработка оставшихся строк продолжится. Затем, по завершении метода Update, Вы должны произвести итерацию по всем строкам таблицы, исследовать свойство Errors Каждой строки и реагировать соответствующим образом. Если вы производите пакетное обновление в ADO. NET 2.0, базой данных фиксируется или отменяется весь пакет в пределах транзакции. Если в процессе обработки пакета возбуждается исключение, все строки этого пакета потерпят неудачу. Каким образом вы обрабатываете наличие ошибок или, если вы не устанавливаете в True Свойство ContinueUpdateOnError, Выброшенное исключение, будет зависеть от приложения. Возможно, вам нужно будет лишь зарегистрировать проблему, либо вы можете представлять пользователям список неудавшихся обновлений и текущих значений в базе данных, предусмотрев какого-то рода пользовательский интерфейс слияния данных, позволяющий им разрешить конфликт. Если вы привязываете данные к элементу управления Windows Forms DataGridview, Сетка сама обнаружит наличие ошибок и обозначит проблему значком и всплывающей подсказкой.

Иерархия классов Windows Forms

в классы windows forms как

Как вы можете видеть из рис. В.9, классы Windows Forms, как и любые классы. NET, производятся от Object. Следующей ступенькой в родословной форм и элементов управления является MarshalByRefObject. Далее идет базовый класс Component. Этот класс применяется для классов, которые будут использоваться в контейнерных сценариях, где они могут либо сами содержаться в родительском контейнере, либо содержать другие компоненты. Базовый класс Component позволяет также Visual Studio отображать для класса рабочую поверхность, на которую можно сбрасывать другие компоненты и элементы управления. Эти объекты могут выбираться и конфигурироваться в окне Properties через их свойства, как вы уже видели, работая с формами и элементами управления Windows Forms. Следующим и, вероятно, одним из важнейших базовых классов является Control. Это тот класс, где находится большинство из общих свойств и поведений UI. Класс Control предусматривает поддержку для таких функций, как ввод от клавиатуры и мыши, спецификация цветов фона и переднего плана и спецификация информации о размере и положении. На самом деле класс Control инкапсулирует дескриптор окна Windows и реализует события, соответствующие всем общим сообщениям Windows, которые окно может получать через операционную систему. Класс Control реализует свой собственный цикл обработки сообщений и экспонирует базирующиеся на сообщениях системы Windows события в качестве событий. NET для ваших элементов управления и контейнеров, чтобы вам не нужно было беспокоиться о всех низкоуровневых материях операционной системы. Если бы хотели создать свой собственный специальный элемент управления с самого начала и сделать его ответственным за рисование своего пользовательского интерфейса, то в качестве его базового класса могли бы взять Control, как в случае с показанным на рис. В.9 классом MyCus — tomControl. Производя класс от Control, вы унаследовали бы интерфейс, наличие которого формы и элементы управления ожидают у других элементов управления, а затем могли бы требуемым образом расширить поведение и отображение своего элемента управления.

Привязка столбца изображений к элементу управления PictureBox

в этом примере предполагается что

Давайте начнем с визуально привлекательного примера — привязки столбца типа Image В базе данных к элементу управления PictureBox На форме. В этом примере предполагается, что в базе данных хранятся байты битовой матрицы. Столбец Image В базе данных представлен в наборе данных байтовым массивом . По умолчанию в этом списке содержится только сетка DataGridView, Поскольку детализация является по существу не элементом управления, а специальным механизмом генерации элементов управления, который всегда доступен для любого сложного типа, экспонирующего открытые свойства. Кроме того, выпадающий список Data Type содержит элемент , Позволяющий задать список элементов управления, которые должны будут представлять компоненты данных специального типа. Когда вы выбираете и добавляете типы элементов управления в список, предлагаемый окном Data Sources, вы можете, вообще говоря, генерировать такой код привязки, который не будет компилироваться. Для успешной компиляции и работы кода привязки необходимо, чтобы свойство для привязки по умолчанию в выбранном типе элементов управления соответствовало типу данных привязываемого компонента данных. Также все будет в порядке, если имеется подходящее преобразование из типа компонента данных в тип привязываемого свойства элемента управления.

Чтобы сделать ваши собственные элементы управления доступными для выбора в списке окна Data Sources, необходимо выполнить несколько предварительных операций. Прежде всего необходимо создать элемент управления Windows Forms, поддерживающий простую или сложную форму привязки данных.

Работа с нулевыми типами в. NET

nullable b b и nul

Инфраструктура.NET Framework Поддерживает два типа. Nullable И Nul — 1аЫе<т>, которые помогают справиться с тем фактом, что среде исполнения.NET Тип-значение не может быть пустым . Эти типы позволяют заключить тип-значение в объект, способный выражать для типа-значения значение логического нуля. Обобщенный вариант Nullable<T> Предпочтительнее, поскольку Nullable Фактически инкапсулирует обычный тип в оболочке ссылочного типа, которая возлагает дополнительную нагрузку на сборщик мусора, если создается много экземпляров. Nullable<T> Сохраняет экземпляр на стеке как тип-значение, но при этом позволяет ему иметь значение Null.

В C# 2.0 для этих типов имеется специальная синтаксическая форма. Вы можете объявить переменную типа-значения с последующим знаком вопроса, который сообщает компилятору, что такую переменную следует создать как экземпляр типа Nullable<T>, Где Т — фактический тип, указанный в сокращенной нотации. Еще одной специальной разновидностью нулевых типов, с которой вы будете часто иметь дело при работе с привязкой данных, является класс DBNull. Это специальный класс-заместитель, предназначенный для представления значений Null В базе данных. Поскольку между Null В Базе данных и Null В.NET Нет стопроцентного соответствия, то если при извлечении значений из базы данных значением столбца является Null, В качестве соответствующего объекта.NET Будет создан экземпляр класса DBNull. Этот класс содержит единственное статическое свойство с именем Value, Которое вы можете использовать для проверки того, не равняется ли нечто DBNull. Однако если вы, как здесь, работаете с Ls<ColumnName>Null, Где <ColumnNa — Me> — это имя сильно типизированного свойства в наборе данных. При помощи этого метода вы можете заменить приведенный выше код следующим, более предпочтительным:

Другой метод, определяемый для каждого такого столбца, это SetcColumnNa — Me>Null. Если вы вызываете этот метод, он присваивает соответствующему свойству в строке данных значение DBNull .Value. Если вы затем используете эту строку для обновления базы данных через адаптер данных или адаптер таблицы, в базу данных будет записано значение логического Null.

Новый элемент C#

вы просто присваиваете событию имя

Новый элемент C# — неявный вывод делегатов — позволяет вам не создавать явным образом экземпляр делегата, чтобы назначить событию обработчик. Вы просто присваиваете событию имя метода с сигнатурой, соответствующей типу делегата события, а компилятор генерирует за вас экземпляр делегата. В Visual Basic используется операция AddHandler, Которая всегда так и работала.

Когда устанавливается источник данных сетки и она отображается, сетка перебирает строки источника данных и добавляет новую строку для каждой из строк в источнике данных, устанавливая значения ячеек в привязанных столбцах соответствующими значениями из источника данных. При создании каждой строки запускается событие RowsAdded. Кроме того, запускается ряд событий при создании каждой из ячеек строки. Как уже упоминалось, вы можете использовать событие Се 11 Formatting, Если хотите программно задавать для ячеек отображаемые значения. Аргумент, передаваемый событию CellFormatting, Экспонирует несколько свойств, сообщающих вам о том, какая ячейка отображается. По свойству Columnidex Вы можете определить, для какого столбца было запущено событие. Свойство сравнивается с индексом столбца Contact в коллекции Columns. Если оказывается, что это именно тот столбец, для которого вы хотите задать значение программно, вы можете получить действительную строку, заполняемую в настоящий момент, при помощи свойства Rowlndex Аргумента события. В данном случае код просто соединяет значения в столбцах ContactName И Phone, Чтобы с помощью метода String.Format Образовать строку с контактной информацией, и устанавливает эту строку в качестве значения столбца Contact. При других обстоятельствах вы можете воспользоваться событием CellFormatting, Чтобы, скажем, произвести поиск значения в другой таблице, такого, как внешний ключ, и использовать результат поиска в качестве значения, отображаемого в несвязанном столбце. Обработчик устанавливает также равным True Свойство FormattingApplied В аргументе события. Это очень важное действие; оно сообщает сетке, что данный столбец подвергается динамическому обновлению. Если этого не сделать, и вы к тому же задаете для столбца автоматическое определение размера, у вас получится бесконечный цикл.