Вы, конечно знаете, что отфильтровать и отсортировать данные реальной таблицы базы данных (БД) можно другим способом — создать 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 фильтрует и сортирует полные строки таблицы, результат всегда содержит все поля данных.
Если определено свойство 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"]);
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.