Prak CSharp/Presentations/Win Forms/6_WF_DataTable

advertisement
Классы из пространства имен System.Data
DataSet
DataTable
DataView
Object
MarshalByValueComponent
DataColumn
DataRow
DataRelation
ForeignKeyConstraint
Constraint
UniqueKeyConstraint
Пространство имен System.Data
 В пространство имен System.Data входят классы, поддерживающие
клиентскую часть архитектуры ADO.NET.
 Центральный класс ADO.NET – класс DataSet, представляющий собой
полную или частичную копию данных на локальном компьютере. Класс
DataSet состоит из набора таблиц DataTable, которые могут содержать
данные, полученные из разных источников.
 Классы DataView и DataViewManager используются для представлений
таблицы, классы DataRow и DataSet - для строк и столбцов таблицы.
 Классы DataRelation, Constraint, ForeignKeyConstraint и
UniqueConstraint используются для описания связей между таблицами и
ограничений для столбцов.
 В пространстве имен System.Data также определены делегаты для
обработчиков событий, классы исключений и перечисления.
Класс DataTable
 Класс DataTable описывает таблицу данных и содержит коллекции
строк (объектов DataRow ) и столбцов (DataColumn).
 Коллекция столбцов определяет схему (schema) таблицы.
 Строки таблицы состоят из полей, отвечающих схеме таблицы.
 Свойства Rows и Columns дают доступ к коллекции строк и
столбцов таблицы:
public DataRowCollection Rows {get;}
public DataColumnCollection Columns {get;}
 В коллекциях определены индексаторы, причем доступ к элементам
коллекций возможен как по номеру, так и по имени объекта.
Класс DataTable -2
 Открытые конструкторы класса DataTable
DataTable();
DataTable( string tableName );
 Свойство TableName используется для идентификации таблицы:
public string TableName {get; set;}
 После создания объекта DataTable с использованием открытых
конструкторов класса он не имеет схемы (schema).
 Чтобы определить схему таблицы DataTable, необходимо создать
объекты DataColumn и добавить их к коллекции Columns таблицы.
Класс DataColumn
 При создании столбцов DataColumn используется конструктор
класса или одна из перегруженных версий метода Add класса
DataColumnCollection.
 Некоторые конструкторы класса DataColumn
DataColumn();
DataColumn( string columnName );
DataColumn( string columnName, Type dataType );
 В приведенном фрагменте кода создается таблица с именем
“DataMix”, в которую добавляются два столбца:
DataTable tbl = new DataTable("Data Mix");
tbl.Columns.Add(“Color", typeof(System.Drawing.Color));
tbl.Columns.Add("EqualSizes", typeof (bool));
Свойства класса DataColumn
 Некоторые свойства класса DataColumn:
DataTable Table
{get;}
Ссылка на таблицу, в которой находится
столбец.
string ColumnName
{get; set;}
Каждый столбец таблицы должен иметь имя.
Если имя не задано явно, при добавлении
столбца в таблицу свойство ColumnName
получит значение по умолчанию.
Type DataType {get; Тип данных в столбце. Если свойство изменить
set;}
после добавления данных в таблицу, будет
брошено исключение.
bool ReadOnly {get; True, если запрещено изменение значений в
set;}
столбце после того, как строка добавлена в
таблицу. Умолчание – false.
Свойства класса DataColumn -2
bool Unique {get;
set;}
true, если все значения в столбце должны быть
различны. Умолчание – false.
bool AutoIncrement
{get; set;}
true - при добавлении в таблицу значение поля
вычисляется автоматически с использованием
значений свойств AutoIncrementSeed (тип long )
и AutoIncrementStep (тип long ).
string Caption
{get; set;}
Заголовок столбца.
object DefaultValue Значение по умолчанию.
{get; set;}
int Ordinal {get;}
Порядковый номер в коллекции
DataColumnCollection; -1, если столбец не
добавлен в таблицу.
bool AllowDBNull
{get; set;}
true - поле может иметь значение null.
Умолчание true.
Класс DataRow
 В таблице DataTable данные хранятся в виде строк – объектов типа
DataRow.
 Класс DataRow не имеет открытых конструкторов.
 Ссылку на новую строку в таблице можно получить как возвращаемое
значение метода NewRow класса DataTable.
DataRow NewRow();
 Строка DataRow добавляется к коллекции строк таблицы Rows при
вызове метода Add класса DataRowCollection.
void Add( DataRow row );
virtual DataRow Add( object[] values );
 Доступ к отдельным полям (столбцам) строки таблицы дают
индексаторы, которые принимают как параметр номер или имя
столбца.
Свойства класса DataRow
DataTable Table
{get;}
Ссылка на таблицу, в которой находится
строка.
bool HasErrors
{get;}
Информация об ошибках в строке.
string RowError
{get; set;}
Описание ошибки.
DataRowState
RowState {get;}
Состояние строки.
object[] ItemArray
{get; set;}
Значения всех полей строки в виде массива.
 Доступ к отдельным полям (столбцам) строки дают индексаторы,
определенные в классе DataRow.
object this[ string columnName ] {get; set;}
object this[ DataColumn column ] {get; set;}
object this[ int columnIndex ] {get; set;}
Интерфейсы в классах System.Data
DataTable и DataSet
• IListSource
• ISupportInitializeNotification
• ISupportInitialize
• ISerializable
• IXmlSerializable
DataView
• IBindingListView
• IBindingList
• IList
• ICollection
• IEnumerable
• ITypedList
• ISupportInitializeNotification
• ISupportInitialize
Интерфейс IListSource
 Интерфейс IListSource дает доступ к объекту, который можно
использовать как источник данных
public interface IListSource {
IList GetList();
bool ContainsListCollection {get;} // true, если элементы
// коллекции также реализуют интерфейс IList
}
Редактирование данных таблицы

Класс DataTable поддерживает средства для восстановления
(rollback) исходных значений, которые хранились в таблице до ее
изменения (в том числе программного).

Для каждой строки таблицы поддерживается четыре версии:
•
Current – измененные значения;
•
Original – значения до изменения;
•
Proposed – существует только в процессе редактирования ;
•
Default – одна из предыдущих версий (зависит от состояния
строки).

Методы класса DataTable
public void AcceptChanges();
public virtual void RejectChanges();
Текущее состояние строки
 Каждая строка таблицы хранит информацию о текущем состоянии в
виде значения перечисления DataRowState.
Значения перечисления DataRowState
Unchanged
Строка не изменялась.
Added
Строка была добавлена к таблице.
Modified
Один из элементов строки был изменен.
Deleted
Строка была удалена из таблицы.
Detached
Состояние Detached имеет строка, которая была
создана, но не добавлена в коллекцию
DataRowCollection.
 Информация о текущем состоянии строки доступна через свойство:
public DataRowState RowState {get;}
Значения полей для разных версий строки
 Можно получить значения полей для разных версий строки с
помощью определенных в DataRow индексаторов :
object this[ DataColumn column, DataRowVersion version ] {get;}
object this[ string columnName, DataRowVersion version ] {get;}
object this[ int columnIndex, DataRowVersion version ] {get;}
Значения перечисления DataRowVersion
Current
Текущее значение строки. Не определено для значения
Deleted свойства RowState.
Default
Зависит от состояния строки. Для значений Added,
Modified и Unchanged это версия Current, для Deleted Original, для Detached - Proposed.
Original
Исходное значение строки, не определено для значения
Added свойства RowState.
Proposed
Предлагаемое значение для строки. Существует только в
процессе выполнения редактирования строки, а также
для строк, которые не являются элементами коллекции
DataRowCollection.
Значения полей для разных версий строки -2
 В следующем примере все строки таблицы DataTable tbl, для которых
существует версия DataRowVersion.Current, выводятся в MessageBox
string str = " Current Version \n";
foreach ( DataRow dtRow in tbl.Rows )
{ if ( dtRow.HasVersion(DataRowVersion.Current))
for ( int j=0; j< dtRow.ItemArray.Length; j++)
{ str +=
dtRow[j,DataRowVersion.Current].ToString()+
"\t";
}
str += "\n";
}
MessageBox.Show(str);
События класса DataTable
 В классе DataTable определены следующие события, которые может
обработать приложение:
ColumnChanged
Происходит, когда процесс изменения значения
успешно завершен.
ColumnChanging
Происходит непосредственно перед тем, как
столбец таблицы будет изменен.
RowChanged
Происходит после того, как успешно завершено
редактирование строки.
RowChanging
Происходит непосредственно перед тем, как
строка таблицы будет изменена.
RowDeleted
Происходит после того, как строка таблицы была
помечена как удаленная (Deleted).
RowDeleting
Происходит непосредственно перед тем, как
строка таблицы будет помечена как удаленная
(Deleted).
События класса DataTable -2
 По умолчанию каждое изменение значения в столбце порождает
четыре события – сначала ColumnChanging и ColumnChanged для
столбца, в котором изменилось значение, а затем события
RowChanging и RowChanged.
 Обработчики событий ColumnChanging и ColumnChanged имеют тип:
public delegate void DataColumnChangeEventHandler
( object sender, DataColumnChangeEventArgs e);
 В обработчик передается новое значение и информация о столбце и
строке таблицы через свойства класса DataColumnChangeEventArgs.
public DataColumn Column {get;}
public DataRow Row {get;}
public object ProposedValue {get; set;}
 События RowChanging и RowChanged не содержат информации о
том, в каком из столбцов изменилось значение.
Информация о корректности данных
 Свойства класса DataRow с информацией о корректности данных в
строке:
bool HasErrors {get;}
string RowError {get; set;}
 Методы класса DataRow для проверки корректности данных.
void SetColumnError( DataColumn column, string error );
void SetColumnError( int columnIndex, string error );
void SetColumnError( string columnName, string error );
string GetColumnError( DataColumn column ); // 3 версии
public DataColumn[] GetColumnsInError();
void ClearErrors();
 В классе DataTable
bool HasErrors {get;}
public DataRow[] GetErrors();
 В классе DataSet
bool HasErrors {get;}
Класс DataView
 Класс DataView дает возможность создать несколько представлений
(view) для одного и того же множества данных из объекта DataTable,
используя различные критерии сортировки и/или фильтрации.
public class DataView : MarshalByValueComponent, IBindingList,
IList, ICollection, IEnumerable,
ITypedList, ISupportInitialize
 Класс DataView всегда связан с объектом DataTable.
 С каждым объектом DataTable по умолчанию всегда связан один
объект DataView . Ссылку на него можно получить через свойство класса
DataTable:
public DataView DefaultView {get;}
 Другие представления для таблицы можно создать с помощью
конструкторов класса DataView.
Класс DataView -2
public DataView();
public DataView(DataTable);
public DataView(DataTable, string, string, DataViewRowState);
 В конструкторе класса DataView можно сразу задать критерии
фильтрации и сортировки.
 Критерии сортировки и фильтрации можно задать и как свойства
класса DataView :
virtual string RowFilter {get; set;}
DataViewRowState RowStateFilter {get; set;}
string Sort {get; set;}
 Критерий фильтрации определяется значением двух свойств RowFilter и RowStateFilter.
Сортировка
string Sort {get; set;}
 Строка, определяющая критерий сортировки, должна содержать имя
столбца, за которым после пробела следуют символы "ASC" (ascending –
умолчание) или "DESC" (descending). Через запятую можно перечислить
имена нескольких столбцов.
 В приведенном ниже примере строки сортируются в порядке убывания
по значению столбца с именем “Shape”, строки с одинаковым значением
в столбце “Shape” сортируются в порядке убывания по значению
столбца с именем “Height”.
DataView dview2 = new DataView(tbl.Table);
dview2.Sort = "Shape DESC, Height DESC";
Фильтрация
 Критерий фильтрации определяется значением двух свойств RowFilter и RowStateFilter.
virtual string RowFilter {get; set;}
DataViewRowState RowStateFilter {get; set;}
 Свойство RowStateFilter дает возможность сформировать DataView, на
основе версии строки, которая определяется значением перечисления
DataViewRowState .
 В приведенном ниже примере в представление DataView входят
исходные версии измененных строк (состояние ModifiedOriginal).
DataView dview1 = new DataView(tbl.Table);
dview1.RowStateFilter = DataViewRowState.ModifiedOriginal;
Фильтрация -2
 Свойство RowFilter дает возможность фильтровать строки по
значениям полей.
 Критерий фильтрации задается с помощью строки, которая содержит
имя столбца, знак операции и значение.
 В приведенном ниже примере, в представление будут входить строки,
для которых значение полей в столбце с именем “Width” больше 10, но
меньше 50:
DataView dview2 = new DataView(tbl.Table);
Dview2.RowFilter = “Width > ’10’ AND Width < ’50’ ";
 В приведенном ниже фрагменте кода, в представление будут входить
строки, для которых значение поля в столбце с именем “Shape”
содержит символы ‘кр’:
DataView dview2 = new DataView(tbl.Table);
dview2. RowFilter = “Shape LIKE ‘*кр*’";
Свойства DataView
 Некоторые свойства класса DataView:
bool AllowDelete {get; set;}
Разрешено удаление строк.
bool AllowEdit {get; set;}
Разрешено редактирование
строк.
bool AllowNew {get; set;}
Разрешено добавление
строк.
DataRowView this[ int recordIndex ] Индексатор для доступа к
{get;}
строке.
DataTable Table {get; set;}
Ссылка на таблицу.
bool ApplyDefaultSort {get; set;}
Применить сортировку по
умолчанию.
Класс DataRowView
 Класс DataRowView описывает отдельную строку представления
DataView.
 Свойства класса DataRowView:
DataView DataView {get;}
Ссылка на DataView, которой
принадлежит строка.
DataRow Row {get;}
Ссылка на DataRow, которую
представляет DataRowView.
DataRowVersion RowVersion
{get;}
Текущая версия строки.
object this[ int ndx ] {get;
set;}
object this[ string property ]
{get; set;}
Индексатор, с помощью которого
можно получить доступ к полям
разных версий строки.
bool IsNew {get;}
Строка является новой.
bool IsEdit {get;}
Строка находится в процессе
редактирования.
Download