Опубликован: 05.08.2007 | Уровень: специалист | Доступ: платный
Лекция 9:

Объект DataView. Вывод связанных таблиц

< Лекция 8 || Лекция 9: 12345 || Лекция 10 >
Аннотация: Объект DataView. Фильтрация и сортировка данных. Вывод связанных таблиц. Вывод двух таблиц в один элемент DataGrid. Вывод связанных таблиц в два элемента DataGrid. Свойство PrimaryKey. Поиск данных. Классы HashTable и ArrayList

Внимание! Для работы с лекциями 9, 10 необходимы учебные файлы, которые Вы можете загрузить здесь.

Объект DataView. Вывод связанных таблиц

Объект DataView. Фильтрация и сортировка данных

В объект DataSet можно загрузить большое количество данных и затем, отсоединившись от источника, использовать их по частям. Объект DataView предназначен для работы с упорядоченной определенным образом частью данных, загруженных в DataSet. Подобно всем объектам ADO .NET, с ним можно работать как при помощи визуальных средств среды, так и программно.

Скопируйте папку приложения VisualDataSQL из "Объекты ADO .NET" и переименуйте ее в VisualDataView. Открываем проект и перетаскиваем на форму еще один элемент DataGrid, свойству Dock которого устанавливаем значение Bottom. Выделив добавленный элемент DataGrid, перетащим на форму элемент управления Splitter (разделитель), свойству Dock которого также установим значение Bottom. В результате на форме располагаются две таблицы, в режиме запуска размеры покрытия их можно будет изменять, передвигая разделитель. Переключаемся на вкладку Data панели инструментов Toolbox и пертаскиваем на форму элемент DataView (рис. 9.1).

Элемент управления DataView

Рис. 9.1. Элемент управления DataView

Добавленный объект появляется на панели компонент. Прежде всего следует определить, что будет представлять источник данных для него. Переходим в окно Properties, в свойстве Table выбираем таблицу Customers объекта DataSet (рис. 9.2).

Определение таблицы объекта DataView

Рис. 9.2. Определение таблицы объекта DataView

Теперь определим фильтр, который будет определять содержимое DataView. Выбираем свойство RowStateFilter, нажимаем на кнопку "Original Rows" (рис. 9.3, A), затем снимаем все галочки, кроме "Deleted" (рис. 9.3, Б).

Окно свойств объекта DataView

Рис. 9.3. Окно свойств объекта DataView

Кнопка "Original Rows" переключает на свойства первоначальных (оригинальных), исходных записей, загружаемых в DataSet. Выбрав пункт "Deleted", мы тем самым отобрали фильтр для удаленных записей.

В окне Properties второго элемента DataGrid в свойстве DataSource устанавливаем объект DataView в качестве источника данных (рис. 9.4).

Определение объекта DataView в качестве источника данных для объекта DataGrid

Рис. 9.4. Определение объекта DataView в качестве источника данных для объекта DataGrid

Запускаем приложение. Выделяем записи поля CustomerID со значениями "ANTON" и "BLAUS" и удаляем их - они немедленно появляются во втором элементе DataGrid (рис. 9.5).

Удаленные записи оказываются во второй таблице

увеличить изображение
Рис. 9.5. Удаленные записи оказываются во второй таблице

Изменим фильтр - в поле свойства RowStateFilter нажимаем на кнопку "Current Rows" (Текущие записи) и оставляем галочки на пунктах "New" и "Current Modified" (рис. 9.6):

Установка нового фильтра

Рис. 9.6. Установка нового фильтра

Запускаем приложение. Теперь во вторую таблицу будут помещаться текущие записи, в которые были внесены изменения - в первой записи в поле City было добавлено "123", а также новые записи - прокручиваем список до конца и вводим данные (рис. 9.7).

Применение фильтра по новым и измененным записям

увеличить изображение
Рис. 9.7. Применение фильтра по новым и измененным записям

Каждый объект DataSet поддерживает две версии - исходную, полученную при загрузке из базы данных, и текущую, в которую были внесены изменения. Данные, выведенные на форму в элемент управления DataGrid, можно изменять, при этом фиксируется статус записей объекта DataRow с помощью свойства RowState. Свойство RowStateFilter осуществляет фильтрацию по этому свойству, причем кнопке "Original" соответствуют исходные данные, а кнопке "Current" - текущие. Значения этого свойства приведены в таблице 9.1.

Таблица 9.1. Значения свойства RowStateFilter объекта DataView
Свойство Описание
Unchanged Записи без изменений
New Новые записи
Deleted Удаленные записи
Current Modified Измененные записи с их текущими значениями
Original Modified Измененные записи с их первоначальными значениями

Как мы уже видели, для одного объекта DataView в пределах одной версии объекта DataSet (исходной или текущей) возможно объединение фильтров - например, отображение новых и удаленных записей.

Свойство RowFilter предназначено для вывода записей, содержащих определенное значение заданного поля. Установим свойству RowStateFilter значение по умолчанию - CurrentRows, - а затем в свойстве RowFilter введем фильтрацию (рис. 9.8):

City = 'London'
Свойство RowFilter объекта DataView

Рис. 9.8. Свойство RowFilter объекта DataView

Запускаем приложение. Во второй таблице выводятся все записи с названием города "London" (рис. 9.9, А). Установив в свойстве RowFilter другое значение - ContactName = 'Thomas Hardy', - получаем одну запись, содержащую это значение (рис. 9.9, Б):

Вывод записей со значением "London" поля City (А) и записи со значением "Thomas Hardy поля ContactName (Б)

увеличить изображение
Рис. 9.9. Вывод записей со значением "London" поля City (А) и записи со значением "Thomas Hardy поля ContactName (Б)

Свойство Sort предназначено для вывода записей в порядке возрастания (ascending, ASC) или убывания (descending, DESC) по значениям заданного поля. В принципе, элемент DataGrid сам по себе поддерживает сортировку - достаточно просто щелкнуть по заголовку поля. Однако это требует действий от пользователя, тогда как объект DataView может предоставлять данные уже в готовом виде.

Удаляем значение свойства RowFilter, в поле свойства Sort вводим "City ASC" (рис. 9.10):

 Сортировка по полю City

Рис. 9.10. Сортировка по полю City

Запускаем приложение. Во второй таблице отображаются записи со значениями поля City в порядке возрастания (рис. 9.11, А). Введем другое значение поля Sort - "ContactName DESC" - в результате получаем сортировку записей в порядке убывания по полю CompanyName (рис. 9.11, Б):

 Сортировка записей по полю City (А), сортировка записей по полю ContactName (Б)

Рис. 9.11. Сортировка записей по полю City (А), сортировка записей по полю ContactName (Б)

В программном обеспечении к курсу вы найдете приложение VisualData View (Code\Glava4\ VisualDataView).

Приступим теперь к рассмотрению этих же свойств объекта DataView, создаваемых программным образом. Скопируйте папку приложения ProgrammDataSQL и переименуйте ее в ProgrammDataView. Добавляем на форму второй DataGrid и Splitter точно так же, как мы это сделали в предыдущем приложении. Переходим в конструктор формы и изменяем код следующим образом:

public Form1()
{
	InitializeComponent();
	SqlDataAdapter dataAdapter = new SqlDataAdapter(CommandText, ConnectionString);
	DataSet ds = new DataSet();
	//Создаем экземпляр dtCustomer объекта DataTable
	DataTable dtCustomer = ds.Tables.Add("Customer");
	dataAdapter.Fill(ds, "Customer");
	dataGrid1.DataSource = ds.Tables["Customer"].DefaultView;
	//Создаем экземпляр myDataView объекта DataView,
	//передаем ему объект dtCustomer
	DataView myDataView = new DataView(dtCustomer);
	//Устанавливаем фильтр для удаленных записей
	myDataView.RowStateFilter = DataViewRowState.Deleted;
	//Для второго элемента DataGrid указываем myDataView
	//в качестве источника данных.
	dataGrid2.DataSource = myDataView;
}

Объект DataView представляет данные объекта DataTable - именно поэтому нам пришлось создать экземпляр dtCustomer. Запускаем приложение и проверяем его функциональность - результат должен быть в точности такой же, как и ранее.

Для вывода новых строк (DataViewRowState.Added) и (символ "|" ) измененных (DataViewRowState.ModifiedCurrent) фильтр будет выглядеть так:

myDataView.RowStateFilter =
 ((DataViewRowState)((DataViewRowState.Added | DataViewRowState.ModifiedCurrent)));

Закомментируем в коде свойство RowStateFilter. Для вывода фильтров по свойству RowFilter используем следующие фрагменты кода:

//Выводим все записи со значением 'London' поля City:
myDataView.RowFilter = "City = 'London'";

Или

//Выводим все записи со значением 'Thomas Hardy' поля ContactName:
myDataView.RowFilter = "ContactName = 'Thomas Hardy'";

Закомментируем после проверки в коде эти фрагменты и добавим сортировку записей:

// Сортируем записи по полю "City" в порядке возрастания
myDataView.Sort = "City ASC";

Или

//Сортируем записи по полю ContactName в порядке убывания
myDataView.Sort = "ContactName DESC";

В программном обеспечении к курсу вы найдете приложение Programm DataView (Code\Glava4\ ProgrammDataView).

< Лекция 8 || Лекция 9: 12345 || Лекция 10 >
Александра Тимофеева
Александра Тимофеева
Украина, Киев
Bakke Aleksander
Bakke Aleksander
Россия, Mуниципальный округ N 4