Введение в ADO.NET. Источник данных - XML-файл. Отображение данных связанной таблицы, страница 18

Вы, конечно знаете, что отфильтровать и отсортировать данные реальной таблицы базы данных (БД) можно другим способом — создать SQL-запрос и выполнить его относительно БД. Метод Select класса DataTable — слабое подобие этого подхода.

Класс DataView позволяет фильтровать данные не только по критерию отбора содержимого таблицы, но и по состоянию ее строк. Строки таблицы могут быть в разных состояниях. Следующая таблица поясняет сказанное.

DataViewRowState

Описание

Значение

None

None

0

Unchanged

Неизмененные (немодифицированные) строки

2

Added

Вновь добавленные строки

4

Deleted

Удаленные строки

8

ModifiedCurrent

Текущие версии модифицированных строк

16

ModifiedOriginal

Оригинальные версии модифицированных строк

22

CurrentRows

Неудаленные строки (объединение флагов ModifiedCurrent, Added, Unchanged)

32

OriginalRows

Оригинальнне версии удаленных, модифицированных и немодифицированных строк (объединение флагов ModifiedOriginal, Deleted, Unchanged)

42

Для того, чтобы задействовать фильтрацию на основе состояния, к предыдущим настройкам добавим еще одну.

view.RowStateFilter = DataViewRowState.Added;

После этого в DataView попадут только вновь добавленные строки. Благодаря предыдущим настройкам, они будут отсортированы по убыванию адресов и в них будут отобраны студенты, имена которых начинаются на букву C. Просмотреть  результат фильтрации можно с помощью следующего кодового фрагмента.

DataRowView rv;

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

{

  rv = view[i];

  Console.WriteLine(rv["Name"] + ", " + rv["Addr"]);

}

Здесь работает класс DataRowView, который инкапсулирует функциональность образа строки таблицы. Напомним, что в Windows-приложениях просмотр консоли (в окне Output) работает только в режиме отладки.

Все настройки объекта DataView можно задать при помощи одного из конструкторов и не обращаться к свойствам RowFilter, Sort и RowStateFilter, как было показано выше. Например.

DataView view = new DataView (ds.Tables[0], "Name LIKE 'C*'",

  "Addr DESC", DataViewRowState.Deleted);

viewGrid.DataSource = view;

Возможности DataView не превышают возможностей SQL-запросов, они значительно скромнее. Например, с помощью DataView нельзя объединять данные нескольких таблиц (JOIN queries), или исключать какие-то колонки. DataView фильтрует и сортирует полные строки таблицы, результат всегда содержит все поля данных.

Методы Find и FindRows класса DataView

Если определено свойство Sort объекта DataView, то с помощью метода Find можно найти определенную строку таблицы, но только на основе данных той колонки, для которой был установлен свойство Sort. Например.

DataView view = new DataView(ds.Tables[0]);

view.Sort = "Name";

int n = view.Find("Charlie Parker");   // Здесь не может быть задан адрес, или другое поле (только имя)

string s = "Row not found!";

if (n != -1)

  s = view[n]["Name"] + ", home address: " + view[n]["Addr"];

Console.WriteLine (s);

Метод FindRows помогает отыскать множество строк, удовлетворяющих критерию поиска. Этот метод также работает с колонкой, по которой был отсортирован образ таблицы.

view = new DataView(ds.Tables[1]); // Образ таблицы экзаменов

view.Sort = "Mark";     // Поле "оценка" за экзамен

DataRowView[] drv = view.FindRows("3");    // FindRows возвращает все тройки, полученные на экзаменах

foreach (DataRowView rv in drv)

  Console.WriteLine(rv["StudID"] + ". " + rv["Course"]);