Читать в оригинале

<< Предыдущая Оглавление Следующая >>


4.4.4. Объект DataView

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

 

Фильтрация данных

 

Создадим новое Windows-приложение. На форму добавим соединение с SQL-базой данных и два компонента DataGridView. Первый компонент настроим на отображение таблицы «Туристы». Для второго компонента сформируем следующий код в обработчике события Form_Load:

DataView myDataView = new DataView(bDTur_firmSQL2DataSet.Туристы);
myDataView.RowStateFilter = DataViewRowState.Deleted;
dataGridView2.DataSource = myDataView;

Запустив приложение, удалим последнюю строку таблицы «Туристы». Она удаляется из первого компонента DataGridView и появляется во втором (рис. 126).

Рис. 126. Демонстрация удаленных записей

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

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

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

Возможные значения свойства RowStateFilter приведены в таблице 17.

Свойство RowFilter предназначено для вывода записей, содержащих определенное значение заданного поля.

Таблица 17. Значения свойства RowStateFilter объекта DataView

Свойство

Описание

Unchanged

Записи без изменений

New

Новые записи

Deleted

Удаленные записи

Current Modified

Измененные записи с их текущими значениями

Original Modified

Измененные записи с их первоначальными значениями

В качестве примера установим фильтрацию по фамилии «Иванов»:

DataView myDataView = new DataView(bDTur_firmSQL2DataSet.Tуристы);
myDataView.RowFilter = "Фамилия = 'Иванов'";
dataGridView2.DataSource = myDataView;

После запуска приложения во второй таблице выводятся все записи с фамилиями туристов «Иванов» (рис. 127).

Рис. 127. Фильтрация записей по содержимому поля

 

Сортировка данных

 

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

Удалим значение свойства RowFilter, в поле свойства Sort введем «Фамилия ASC» (результат на рис. 128):

DataView myDataView = new DataView(bDTur_firmSQL2DataSet.Туристы);
myDataView.Sort = "Фамилия, Имя ASC";
dataGridView2.DataSource = myDataView;

Рис. 128. Сортировка данных по полю «Фамилия»

 

Поиск данных

 

Технология ADO .NET предоставляет значительные возможности для поиска данных - такие объекты, как DataSet, DataTable, содержат специализированные методы для быстрого решения этой задачи. Свойство RowFilter объекта DataView может применяться для создания простого и эффективного поиска.

Запускаем Visual Studio 2008 и создаем новый проект типа Windows Forms Control Library (рис. 129).

Внешний вид формы в режиме дизайна представлен на рисунке 130. Перейдем к коду. В конструкторе формы отключаем доступность текстового поля и привязываем обработчик события CheckedChanged для элемента CheckBox:

public FindCheckBox() {
          InitializeComponent();
          txtColumnValue.Enabled = false;
          chbForSearching.CheckedChanged += new EventHandler(chbForSearching_CheckedChanged);
}

В классе формы создаем обработчик события CheckedChanged для CheckBox и определяем действия для значений текстового поля, надписи и элемента CheckBox.

Рис. 129. Выбор шаблона Windows Forms Control Library

Рис. 130. Форма компонента в режиме дизайна

private void chbForSearching_CheckedChanged(object sender, EventArgs e) {
          txtColumnValue.Enabled = chbForSearching.Checked;
}
[Category("Appearance"),
          Description("Название поля, по которому будет осуществляться поиск")]
public string ColumnName
{
          get {return lblColumnName.Text;}
          set {lblColumnName.Text = value;}
}
[Category("Appearance"), Description(" Ключевое слово для поиска")]
public string ColumnValue
{
          get {return txtColumnValue.Text;}
          set {txtColumnValue.Text = value;}
}
[Category("Appearance"), Description("Включение поиска по заданному полю")]
public bool SearchEnabled
{
          get {return chbForSearching.Checked;}
          set {chbForSearching.Checked = value;}
}

Свойства ColumnName, ColumnValue и SearchEnabled будут свойствами композитного элемента управления, которые будут отображаться в его окне Properties. В квадратных скобках указан атрибут для помещения свойства в заданную группу и описание, выводимое на информационную панель.

Откомпилируем приложение и закроем его.

Создадим новое Windows-приложение, которое будет использовать созданный компонент. Расположим на форме следующие элементы управления: Panel, свойству Dock которого установим значение Left, Splitter и DataGridView (свойству Dock последнего устанавливаем значение Fill). Добавим созданный компонент в окно ToolBox и перетаскиваем на панель формы из окна Toolbox четыре копии элемента FindCheckBox. Вид формы приложения в режиме дизайна приведен на рисунке 131.

Обратите внимание, что в окне Properties, при групповом расположении, свойство ColumnName находится в группе Appearance. На информационную панель выводится описание этого свойства на русском языке. Именно эти параметры были указаны при создании композитного элемента. Добавим обработчик кнопки «Поиск»:

private void btnSearch_Click(object sender, System.EventArgs e) {
          try {
            FindCustomers();
          }
          catch(Exception ex) {
            MessageBox.Show(ex. Message);
          }
}

Рис. 131. Расположение элементов на форме

В классе формы создаем метод FindCustomers, в котором будет осуществляться обработка и который вызывается в обработчике кнопки «Поиск»:

private void FindCustomers() {
//Создаем экземпляр filteringFields класса ArrayList
          ArrayList filteringFields = new ArrayList();
//Если элемент fcbCustomerID доступен для поиска
          if (fcbCustomerID.SearchEnabled)
//Добавляем в массив filteringFields значение текстового поля ColumnValue
            filteringFields.Add("CustomerID LIKE \'" + fcbCustomerID.ColumnValue + "%\'");
          if (fcbCompanyName.SearchEnabled)
            filteringFields.Add("CompanyName LIKE \'" + fcbCompanyName.ColumnValue + "%\'");
          if (fcbContactName.SearchEnabled)
            filteringFields.Add("ContactName LIKE \'" + fcbContactName.ColumnValue + "%\'");
          if (fcbPhone.SearchEnabled)
            filteringFields.Add("Phone LIKE \'" + fcbPhone.ColumnValue + "%\'");
          string filter = "";
//Комбинируем введенные в текстовые поля значения.
//Для объединения используем логический оператор "ИЛИ"
          if (filteringFields.Count == 1)
            filter = filteringFields[0].ToString();
          else if (filteringFields.Count > 1) {
            for(int i = 0; i < filteringFields.Count - 1; i++)
                        filter += filteringFields[i].ToString() + " OR ";
//Для объединения полей в запросе используем логический оператор "И"
//                      for(int i = 0; i < filteringFields.Count - 1; i++)
//                      filter += filteringFields[i].ToString() + " AND ";
            filter += filteringFields[filteringFields.Count - 1].ToString();
}
//Создаем экземпляр dvSearch класса DataView
          DataView dvSearch = new DataView(dsCustomers1.Customers);
//Передаем свойству RowFilter объекта DataView скомбинированное значение filter
          dvSearch.RowFilter = filter;
          dataGrid1.DataSource = dvSearch;
}

Как видно из приведенного кода, для объединения условий, накладываемых на поля, используется логический оператор «ИЛИ». Путем некоторого усложнения кода и созданного компонента для поиска можно создать возможность одновременного использования операторов «И» и «ИЛИ» Запустим приложение.

Первый поисковый запрос будет запрашивать всего одно поле (рис. 132).

Рис. 132. Простой поисковый запрос

Усложним запрос: зададим условие на два поля (рис. 133).

Рис. 133. Более сложный поисковый запрос

 



<< Предыдущая Оглавление Следующая >>