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

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

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

Ячейки комбинированных полей поддерживают редактирование, причем пользователь может вводить значения с автозавершением либо выбирать значения в выпадающем списке. В режиме редактирования ячейка служит вместилищем для элемента управления, производного от 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, Которое позволит вам перехватить информацию и либо зарегистрировать ее, либо, возможно, обработать ситуацию в зависимости от аргумента контекста.

Начало исполнения. NET — метод Main

net должна иметь входную точку

Всякая исполняемая программа. NET должна иметь входную точку — место, где исполнение впервые входит в ваш код. В. NET этой входной точкой является метод Main. У есть пара сигнатур, которые может иметь метод Main, чтобы его можно было рассматривать в качестве допустимой входной точки для вашего приложения. Прежде всего это должен быть статический метод одного из классов в приложении, — в приложении Windows Forms в Visual Studio 2005 это обычно класс Program. Он может возвращать либо void, либо int. Обычно вы будете возвращать void, если только ваше приложение не должно запускаться другим приложением, которое будет проверять возвращаемое значение по завершении процесса. Другая вариация метода Main состоит в том, что он может либо не принимать параметров, либо принимать в качестве параметра одиночный массив строк. Следующие примеры исчерпывают методы Main, допустимые для приложения: Если используемый вами метод Main принимает в качестве параметра строковый массив, в этом массиве ему будут передаваться любые аргументы командной строки, использованные при запуске приложения. В отличие от приложений С и C++ первым аргументом не является имя самой программы. В. NET первым аргументом, передаваемым методу Main в строковом массиве, будет первый аргумент из командной строки после имени исполняемой программы, если он есть. Если в командной строке не присутствовало никаких аргументов, аргумент-массив, передаваемый методу Main, все равно будет действительным экземпляром строкового массива. NET, число элементов в котором будет равно нулю, что можно определить, проверив свойство Length массива. В вашем приложении может быть более одного метода Main, но в отдельном классе у вас может быть определен только один метод Main. Если у вас в приложении более одного класса с методом Main, то вы должны будете специфицировать, какой класс является стартовым объектом, либо в свойствах проекта Visual Studio, либо используя аргумент /main компилятора с командной строкой. В массе приложений вам не потребуется вносить каких-либо изменений в метод Main, Который создает за вас Visual Studio в классе Program. Когда Visual Studio создает новый проект Windows Forms, в методе Main Имеется всего две строчки кода:

Транзакции на стороне клиента

работая с данными на стороне

Иногда вам может потребоваться работать с данными на стороне клиента в форме набора данных, имея при этом логику, подобную только что представленной для серверных транзакций, чтобы можно было модифицировать данные, а затем, если что-то пошло не так, вернуть изменения. Работая с данными на стороне клиента, вы можете имитировать транзакцию при помощи методов AcceptChanges И RejectChanges. Как уже говорилось, любые изменения, сделанные в наборе данных, поддерживаются комбинацией состояния строки с текущими и исходными значениями для каждой строки. Если вы сделали в строках вашего набора данных любые изменения и вызываете AcceptChanges, Исходные значения для каждой из модифицированных строк будут заменены текущими значениями, а состояние всех строк установлено в Unchanged. Если вы вызываете Re JectChanges, Текущие значения для любых модифицированных строк будут заменены на исходные значения, вставленные строки отброшены, и состояние всех строк также установлено в Unchanged. Методы AcceptChanges И RejectChanges Определяются в классах DataSet, DataTable И DataRow, Так что вы можете производить эти транзакционно-подобные операции на любом уровне структуры в пределах набора данных, который вам нужен. Используя комбинацию AcceptChanges И Re JectChanges, Вы можете кодировать логику, которая принимает ли отвергает изменения в соответствии с некоторыми критериями. Но в отношении этих методов вы должны иметь в виду, что вы, вообще говоря, должны избегать их применения с набором данных, который собираетесь использовать для обновления базы данных через адаптер данных. Как уже упоминалось, адаптер определяет, какие команды он должен исполнять и для каких строк, исходя из состояния этих строк. Для строк с состоянием Unchanged При обновлении вообще не исполняется никаких команд. Поскольку И AcceptChanges, И Re JectChanges Устанавливают состояние строк в Unchanged, Эти методы имеет смысл использовать с набором данных, обновляющим базу данных, только в сочетании с обсуждавшимися выше обходными приемами для перевода строки в состояние Modified Или Deleted После того, как вызов AcceptChanges Или Re JectChanges Установит немодифицированное состояние строк.

Переходы между DataRowView и DataRow

объект типа dataview b b

DataView — это оболочка, заключающая в себе DataTable, Которая позволяет сортировать или фильтровать строки таблицы. Объект типа DataView Сам по себе не содержит данных, он только осуществляет представление данных из таблицы заданным образом. Отдельные строки в DataView Являются экземплярами класса DataRowView. Этот класс, подобно и самому DataView, Также является оболочкой для отдельных строк из таблицы, где содержатся данные.

Поскольку, указывая в качестве источника данных таблицу, вы в действительности привязываетесь к псевдотаблице DataView, Элементы данных в списке будут принадлежать к типу DataRowView. Класс DataView Реализует все необходимые интерфейсы привязки данных для коллекций, а класс DataRowView Реализует интерфейсы, необходимые для индивидуальных объектов-элементов коллекции данных. Благодаря этому специфика привязки данных в разных случаях остается вне базовых классов-контейнеров DataSet, DataTable И DataRow, Поэтому эти коллекции потребляют меньше памяти в случае, когда они не используются для привязки. Если вы запрашиваете элементы из привязанной таблицы данных через свойство Current Источника привязки BindingSource Или через ссылку IBindingList, То получаете экземпляр DataRowView. Это часто делается, чтобы получить представляемый им DataRow. Чтобы перейти непосредственно к строке данных, вы просто обращаетесь к свойству Row В DataRowView. Например, если у вас есть сильно типизированный набор данных о клиентах, привязанный через источник привязки, и вы хотите программно работать с текущей строкой, вы можете получить через DataRowView Сильно типизированную строку, явуляюицуюся текущим элементом: