Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции OOP c#.doc
Скачиваний:
44
Добавлен:
22.09.2019
Размер:
3.38 Mб
Скачать

4.15. Класс DataView

Метод DataTable.Select() – очень мощный и гибкий, но не является оптимальным решением для всех ситуаций. У него есть два основных ограничения. Во-первых, метод принимает динамические критерии поиска и поэтому не может быть сверхэффективным. Во-вторых, Windows- и Web-формы не поддерживают связывание с возвращаемым значением метода Select() – массивом объектов DataRow. В ADO.NET предусмотрено решение, обходящее оба этих ограничения – объект класса DataView.

Объекты DataView позволяют фильтровать, сортировать и вести поиск в содержимом таблиц. Объекты DataView не являются SQL-запросами, в отличие от представлений (view) в базах данных. С помощью DataView нельзя объединить данные двух таблиц, равно как и просмотреть отдельные столбцы таблицы. Объекты DataView поддерживают фильтрацию запросов на основе динамических критериев, но разрешают обращаться только к одному объекту DataTable; кроме того, через DataView всегда доступны все столбцы таблицы. У объекта DataView нет собственной копии данных. При обращении через DataView к данным он возвращает записи, хранящиеся в соответствующем объекте DataTable.

Чтобы просмотреть с помощью объекта DataView данные некоторой таблицы, его следует связать с этой таблицей. Есть два способа сделать это: используя свойство Table объекта DataView или при помощи конструктора DataView. Следующие фрагменты эквивалентны:

DataTable dt = CD_Rent.Tables["Disks"];

// Первый вариант

DataView dv = new DataView();

dv.Table = dt;

// Второй вариант

DataView dv = new DataView(dt);

У DataView также есть конструктор, сигнатура которого более точно соответствует методу DataTable.Select(). Этот конструктор задает значения свойств Table, RowFilter, Sort и RowStateFilter объекта DataView в одной строке кода. Следующие варианты кода эквивалентны:

DataTable dt = CD_Rent.Tables["Disks"];

// Первый вариант

DataView dv = new DataView();

dv.Table = dt;

dv.RowFilter = "release_year = 2005";

dv.Sort = "title DESC";

dv.RowStateFilter = DataViewRowState.ModifiedOriginal;

// Второй вариант

DataView dv = new DataView(dt, "release_year = 2005",

"title DESC",

DataViewRowState.ModifiedOriginal);

Свойство RowStateFilter принимает значения из перечисления DataViewRowState. Это перечисление можно рассматривать как комбинацию свойства RowState объекта DataRow и перечисления DataRowVersion.

  • Added – отображаются добавленные строки;

  • CurrentRows – отображаются строки, которые не были удалены (значение по умолчанию);

  • Deleted – отображаются удаленные строки;

  • ModifiedCurrent – отображаются измененные строки с их текущими значениями;

  • ModifiedOriginal – отображаются измененные строки с их оригинальными значениями;

  • None – строки не отображаются;

  • OriginalRows – отображаются удаленные, измененные и не изменявшиеся строки с их оригинальными значениями;

  • Unchanged – отображаются строки, которые не изменялись.

Свойство RowStateFilter работает в качестве двойного фильтра. Например, если задать ему значение ModifiedOriginal, через объект DataView окажутся доступны только измененные записи, и вы будете видеть их оригинальные значения.

Объект DataView возвращает данные с помощью собственного специализированного объекта – DataRowView. Функциональность DataRowView в целом аналогична функциональности DataRow. DataRowView обладает свойством Item, позволяющим обращаться к содержимому поля как по имени, так и по порядковому номеру. И хотя свойство Item разрешает просматривать и изменять содержимое поля, через DataRowView доступна только одна версия данных строки – та, которая указана при помощи свойства DataRowVersion. Если объект DataRowView не обеспечивает требуемых возможностей, обратитесь при помощи свойства Row этого объекта к соответствующему объекту DataRow из таблицы.

Доступ к данным объекта DataTable при помощи DataView осуществляется иначе, чем непосредственный доступ к объекту DataTable. Таблица предоставляет свои строки через свойство Rows. У DataView нет похожего, допускающего простое перечисление, набора. DataView имеет свойство Count, возвращающее число строк, и индексатор Item с целым индексом. Используя эти свойства, можно создать простой цикл для просмотра всех строк:

DataView dv = new DataView(dt, "release_year = 2005",

"title DESC",

DataViewRowState.CurrentRows);

for (int i = 0; i < dv.Count; i++) {

DataRowView drv = dv[i];

Console.WriteLine(drv["title"]);

}

Класс DataView предоставляет методы Find() и FindRows(), позволяющие искать в нем данные. Эти методы аналогичны методу Find() коллекции Rows таблицы. Задав значение свойства Sort объекта DataView, вы получите возможность с помощью метода Find() искать строки по значениям столбцов, перечисленных в свойстве Sort. Как и в случае с методом DataRowCollection.Find(), одноименному методу DataView разрешено передавать одно значение или массив значений. Тем не менее, метод DataView.Find() возвращает не объект DataRow или DataRowView, а значение целого типа, соответствующее порядковому номеру нужной строки в объекте DataView. Если искомая строка не найдена, метод вернет -1:

DataTable dt = CD_Rent.Tables["Disks"];

DataView dv = new DataView(dt);

dv.RowFilter = "release_year = 2005";

dv.Sort = "title";

int findIndex = dv.Find("Mezmerize");

if (findIndex != -1)

Console.WriteLine(dv[findIndex]["artist_id"]);

Метод DataView.Find() осуществляет поиск по столбцам, указанным в свойстве Sort. У многих строк могут быть одинаковые значения полей, используемых для сортировки данных. Например, при сортировке дисков по полю release_year это поле может иметь значение "2005" для нескольких строк. Тем не менее, найти посредством метода Find() все диски, выпущенные в 2005 году нельзя, поскольку он возвращает только целочисленное значение. К счастью, класс DataView предоставляет метод FindRows(). Его вызывают так же, как и метод Find(), но метод FindRows() возвращает массив объектов DataRowView, содержащих строки, которые удовлетворяют критериям поиска.

DataTable dt = CD_Rent.Tables["Disks"];

DataView dv = new DataView(dt);

dv.RowFilter = "release_year = 2005";

dv.Sort = "release_year";

DataRowView[] res = dv.FindRows("2005");

if (res.Length != 0)

Console.WriteLine("Find {0} rows", res.Length);

Строка данных модифицируется с помощью объекта DataRowView аналогично изменению содержимого объекта DataRow. Объект DataRowView, как и DataRow, предоставляет методы BeginEdit(), EndEdit(), CancelEdit() и Delete(). Создание новой строки данных при помощи объекта DataRowView несколько отличается от создания нового объекта DataRow. У класса DataView есть метод AddNew(), возвращающий новый объект DataRowView. В действительности же новая строка добавляется в базовый объект DataTable только при вызове метода EndEdit() объекта DataRowView. Ниже показано, как средствами объекта DataRowView создать, изменить и удалить строку данных:

// Создание новой строки с использованием DataView

DataRowView drv = dv.AddNew();

drv[0] = 10;

drv[1] = "Hipnotize";

drv.EndEdit();

// Получение и редактирование строки

drv = dv[1];

drv.BeginEdit();

drv[1] = "H";

drv.EndEdit();

// Получение и удаление строки

drv = dv[0];

drv.Delete();

В таблице 35 приведено краткое описание основных свойств и методов класса DataView.

Таблица 35

Свойства и методы класса DataView

Имя свойства

или метода

Описание

AddNew()

Создает новый объект DataRowView

AllowDelete

AllowEdit

AllowNew

Булевы свойства; указывают, допустимо ли удаление, изменение или добавление записей в объект DataView

ApplyDefaultSort

Если задать свойству значение true, содержимое DataView сортируется по первичному ключу таблицы, связанной с DataView. Кроме того, если изменить значение свойства на true, свойству Sort будут заданы столбцы, составляющие первичный ключ связанной таблицы

BeginInit()

Временно кэширует изменения содержимого DataView

CopyTo()

Позволяет копировать объекты DataRowView, доступные через DataView, в массив

Count

Возвращает число записей в DataView (доступно только для чтения)

Delete()

Метод принимает порядковый номер строки в объекте DataView и удаляет эту строку из базового объекта DataTable

EndInit()

Подтверждает внесение кэшированных изменений в DataView

Find()

Выполняет в DataView поиск отдельной строки данных

FindRows()

Выполняет в DataView поиск нескольких строк данных

GetEnumerator()

Возвращает экземпляр объекта IEnumerator для просмотра строк DataView

Item

Индексатор, возвращает объекты DataRowView, доступные через DataView

RowFilter

Свойство аналогично разделу WHERE SQL-запроса. Через DataView доступны только строки, удовлетворяющие заданному в свойстве критерию. Значение свойства по умолчанию – пустая строка

RowStateFilter

Указывает, какие строки доступны через объект DataView, а также версию этих строк

Sort

Свойство определяет порядок сортировки данных, доступных через DataView, и функционирует аналогично разделу ORDER BY SQL-запроса

Table

Таблица, с которой связан объект DataView