Элементы управления DataGrid и DataGridView Для работы с табличными данными в .NET Framework 1.x использовался элемент управления DataGrid. Начиная с версии 2.0, поддерживается более простой в использовании элемент управления DataGridView. В .NET Framework 3.x элемент DataGrid поддерживается ради совместимости с более ранними версиями. Единственная особенность DataGrid, которая не реализована в DataGridView, иерархическое отображение информации из двух взаимосвязанных таблиц в одном элементе управления. В отличие от DataGrid для отображения информации из двух таблиц, связанных отношением master/detail, необходимо использовать два элемента DataGridView. Оба элемента управления используют стандартную архитектуру привязки данных. Дополнительные возможности DataGridView по сравнению c DataGrid DataGridView поддерживает 6 встроенных типов столбцов ( только 2 в DataGrid). DataGrid отображает данные только из внешнего источника. DataGridView может отображать • неподсоединенные данные (unbound data), которые хранятся в самом элементе управления; • данные из подсоединенного источника; • те и другие одновременно. Класс DataGridView содержит множество свойств и событий для форматирования и управления отображением данных. DataGridView позволяет зафиксировать (freeze) строки и столбцы и тем самым запретить их прокрутку; спрятать(hide) строки, столбцы и заголовки; предусмотреть подсказки (ToolTips) и меню (shortcut menus ) для отдельных ячеек, строк и столбцов. Инициализация DataGridView Элемент управления DataGridView можно инициализировать без использования подсоединенного источника данных, путем добавления столбцов и строк в коллекции DataGridView.Columns и DataGridView.Rows. Можно заполнить DataGridView данными из подсоединенного источника. В классе определены свойства object DataSource { get; set; } string DataMember { get; set; } Источник данных для DataGridView. Имя таблицы или свойства для источников данных, которые содержат несколько таблиц или списков. Значение по умолчанию string.Empty. Источник данных для DataGridView Класс DataGridView использует стандартную модель привязки данных, согласно которой источник данных может быть объектом любого типа, реализующего один из следующих интерфейсов: • IList ( коллекции с IList, одномерные массивы); • IListSource ( типы DataTable и DataSet); • IBindingList ( класс BindingList<(Of <(T>)>) ; • IBindingListView ( класс BindingSource). Рекомендуется использование BindingSource. Для источников с несколькими таблицами или списками можно использовать свойство DataMember объекта BindingSource для конкретизации источника. Если в качестве источника данных используется коллекция объектов ( а не данные, полученные из базы данных) следует присвоить свойству DefaultCellStyle.DataSourceNullValue значение null (вместо значения по умолчанию DBNull.Value). Архитектура элемента управления DataGridView DataGridViewElement DataGridViewBand DataGridViewColumn DataGridViewCell DataGridViewRow DataGridViewButtonCell DataGridViewButtonColum DataGridViewCheckBoxCell DataGridViewCheckBoxColumn DataGridViewComboBoxCell DataGridViewComboBoxColumn DataGridViewImageCell DataGridViewImageColumn DataGridViewLinkCell DataGridViewLinkColumn DataGridViewTextBoxCell DataGridViewTextBoxColumn DataGridViewHeaderCell DataGridViewRowHeaderCell DataGridViewColumnHeaderCell DataGridViewTopLeftHeaderCell Класс DataGridView public class DataGridView : public Control, ISupportInitialize Свойства класса для доступа к коллекциям столбцов(column), строк(row) и ячейке(cell). DataGridViewColumnCollection Columns { get; } Коллекция столбцов таблицы. Класс DataGridViewColumnCollection реализует интерфейсы IList, ICollection и IEnumerable. DataGridViewRowCollection Rows { get; } Коллекция строк таблицы. Класс DataGridViewRowCollection реализует интерфейсы IList, ICollection и IEnumerable. DataGridViewCell Item [ int columnIndex, int rowIndex ] { get; set; } DataGridViewCell Item [ string columnName, int rowIndex ] { get; set; } Ячейка таблицы на пересечении столбца и строки. Класс DataGridView Свойства для доступа к текущей (current) строке и ячейке. DataGridViewRow CurrentRow { get; } Строка, содержащая текущую ячейку. DataGridViewCell CurrentCell { get; set; } Текущая ячейка. Point CurrentCellAddress { get; } Индексы столбца (X) и строки (Y) текущей ячейки. Класс DataGridViewColumn Класс DataGridViewColumn определяет внешний вид и функциональность ячейки таблицы. В классе определены два открытых конструктора – без параметров и конструктор DataGridViewColumn( DataGridViewCell cellTemplate ); который присваивает значение cellTemplate свойству, определяющему шаблон для всех ячеек в столбце. virtual DataGridViewCell CellTemplate { get; set; } Шаблон для всех ячеек в столбце. Значение по умолчанию null. string DataPropertyName { get; set; } Имя свойства или столбца таблицы в источнике данных для заполнения столбца. Type ValueType { get; set; } Тип значений в ячейках столбца. Класс DataGridViewRow Класс DataGridViewRow содержит коллекцию ячеек, которые находятся в строке, и используется для доступа к отдельной ячейке. Класс имеет только один открытый конструктор без параметров. DataGridViewCellCollection Cells { get; } Коллекция ячеек в данной строке таблицы. Класс DataGridViewCellCollection реализует интерфейсы IList, ICollection и IEnumerable. В коллекции определен индексатор с параметром типа string, который дает доступ к значению в ячейке по имени столбца. bool IsNewRow { get; } true, если это последняя строка DataGridView, в которую вводятся значения. bool SetValues ( object[] values ); Метод дает возможность присвоить значения всем ячейкам строки. Если число элементов массива не совпадает с числом ячеек, метод возвращает значение false. Класс DataGridViewCell Класс описывает отдельную ячейку элемента управления DataGridViewCell. Абстрактный класс, который имеет только защищенный (protected) конструктор. Object Value { get; set; } Значение в ячейке DataGridView. virtual Type ValueType { get; set; } Тип значения ячейки. Если не установлен для конкретной ячейки, используется тип данных столбца. Object FormattedValue { get; } Значение в ячейке DataGridView, после форматирования. virtual Type FormattedValueType { get; } Тип отформатированного значения в ячейке. Типы столбцов в DataGridView DataGridViewTextBoxColumn Создается автоматически для строк и чисел при подсоединении источника. DataGridViewCheckBoxColumn Создается автоматически для значений типа Boolean и CheckState при подсоединении источника. DataGridViewImageColumn Для вывода изображений в столбце. Создается автоматически при соединении с массивами байт (byte arrays), Image или Icon. DataGridViewButtonColumn Используется для вывода кнопок в ячейках. Создается вручную. Используется для вывода DataGridViewComboBoxColumn открывающихся списков в ячейках. Создается вручную. DataGridViewLinkColumn Используется для вывода ссылок в ячейках. Создается вручную. Тип столбца DataGridViewComboBoxColumn Ячейки столбца содержат элементы управления ComboBox (открывающийся список). Удобно использовать для выбора элемента из конечного множества значений. Нельзя создать автоматически при подсоединении источника данных. Необходимо создать явно и добавить к коллекции столбцов DataGridView, которая доступна через свойство DataGridView.Columns. Класс имеет только один открытый конструктор (без параметров) и большую часть методов и свойств наследует от базового класса DataGridViewColumn. Список встроенного ComboBox инициализируется через свойства класса DataGridViewComboBoxColumn. Свойства DataGridViewComboBoxColumn Object DataSource { get; set; } Источник для заполнения списка встроенного ComboBox. Умолчание null. Список ComboBox можно задать также через свойство Items. string DisplayMember { get; set; } Имя свойства или столбца в источнике данных (связанного с ComboBox через свойство DataSource) для вывода элементов в список ComboBox . Умолчание String.Empty. string ValueMember { get; set; } Имя свойства или столбца в источнике данных, который используется как значение. Умолчание String.Empty. DataGridViewComboBoxCell. ObjectCollection .Items { get; } Значение свойства Items объекта DataGridViewComboBoxCell (доступно через свойство CellTemplate). При использовании Items значения ValueMember и DisplayMember игнорируются. bool AutoComplete { get; set; } Автоматическое заполнение списка ComboBox. Значения свойств DataSource, ValueMember и AutoComplete получают одноименные свойства объекта CellTemplate и все ячейки в столбце. При изменении значений этих свойств перерисовывается весь столбец. Чтобы изменить значения свойств только для одной ячейки, надо присвоить им значения после того, как они установлены для всего столбца. Тип столбца DataGridViewButtonColumn Ячейки столбца содержат кнопки. Нельзя создать автоматически при подсоединении источника данных. Необходимо создать явно и добавить к коллекции столбцов DataGridView, которая доступна через свойство DataGridView.Columns. Удобно использовать для того, чтобы выполненить операцию с одной записью, например, для того, чтобы вывести дочернюю запись (child record) в отдельном окне. Для выполнения операции обрабатывается событие System.Windows.Forms.DataGridView.CellClick. События DataGridView В классе DataGridView определено около 200 событий ( вместе с унаследованными от класса Control). Классы DataGridViewColumn, DataGridViewRow, DataGridViewCell и их производные не имеют своих событий кроме Disposed. Проверка корректности данных в DataGridView Cобытие CellValidating позволяет проверить корректность введенных в ячейку данных перед тем, как они будут приняты (committed). Событие CellValidating происходит, когда изменяется текущая (current) ячейка. Событие имеет тип public delegate void DataGridViewCellValidatingEventHandler ( Object sender, DataGridViewCellValidatingEventArgs e ); В классе DataGridViewCellValidatingEventArgs определены свойства, которые можно использовать при проверке корректности введенных данных. Свойства класса DataGridViewCellValidatingEventArgs bool Cancel { get; set; } true, если введенное значение не принимается. Свойство унаследовано от CancelEventArgs. Текст, введенный пользователем, передается как значение свойства FormattedValue. Это значение Object FormattedValue { get; } затем разбирается (parsed) и передается как значение свойства Value для ячейки. int ColumnIndex { get; } Номер столбца, в котором находится ячейка. int RowIndex { get; } Номер строки, в которой находится ячейка. Событие DataError Событие DataError происходит, если при обновлении источника данных или при обработке событий Format или Parse возникает ошибка в данных, подсоединенных к элементу управления. Делегат события имеет тип public delegate void DataGridViewDataErrorEventHandler( Object sender, DataGridViewDataErrorEventArgs e ); Тип второго параметра делегата public class DataGridViewDataErrorEventArgs : DataGridViewCellCancelEventArgs Через свойства класса DataGridViewDataErrorEventArgs можно получить дополнительную информацию о состоянии элемента управления DataGridView при возникновении ошибки в данных. Свойства класса DataGridViewDataErrorEventArgs bool Cancel { get; set; } При значении true, ячейка не отдает фокус ввода до тех пор, пока не будет введено корректное значение. Для false при некорректном вводе восстанавливается старое значение. Свойство унаследовано от CancelEventArgs. int ColumnIndex { get; } Номер столбца для ячейки DataGridViewCell, которая является источником события. Унаследовано от DataGridViewCellCancelEventArgs. int RowIndex { get; } Номер строки для ячейки DataGridViewCell, которая является источником события. Унаследовано от DataGridViewCellCancelEventArgs. Exception Exception { get; } Исключение, представляющее ошибку в данных. bool ThrowException { get; set; } true, если исключение необходимо передать другому обработчику DataGridViewDataErrorEventHandler при выходе из делегата. Умолчание false. DataGridViewDataErrorContexts Context { get; } Побитовая комбинация значений перечисления DataGridViewDataErrorContexts, уточняющая причину(контекст) ошибки. Перечисление DataGridViewDataErrorContexts Перечисление содержит информацию о состоянии DataGridView при возникновении ошибки в данных. Перечисление имеет атрибут FlagsAttribute, допускающий побитовую комбинацию значений перечисления. Значение Когда произошла ошибка Formatting Форматирование данных при обмене данными между источником и элементом управления (в любом направлении). Display Вывод(displaying ) данных, полученных из источника. PreferredSize Вычисление предпочтительного (preferred ) размера ячейки при программном изменении размера столбца или строки. RowDeletion Удаление строки в источнике, присоединенном к DataGridView . Parsing Commit Разбор (parsing ) данных (при загрузке из источника или при вводе пользователем). Фиксация (committing) изменений при передаче данных из элемента управления в подсоединенный источник. Перечисление DataGridViewDataErrorContexts -2 Значение InitialValueRestoration LeaveControl CurrentCellChange Scroll ClipboardContent Когда произошла ошибка Восстановление значения, которое имела ячейка до начала редактирования. Может встретиться, если в процессе редактирования изменилось форматирование, которое стало несовместным со старым значением. Элемент управления потерял фокус ввода и не может фиксировать (commit ) изменения, внесенные пользователем. Курсор выделения перешел к другой ячейке , при этом данные в предыдущей ячейке содержат ошибку. Скроллинг DataGridView (программный или пользовательский), в результате которого данные с ошибкой попали в область видимости. Копирование данных в Clipboard.