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

¨  Разработайте новый, более сложный алгоритм поиска. Старый алгоритм поиска (в DataGridView) должен функционировать, как и прежде. Окно вспомогательной формы formFound должно создаваться и обновляться только при изменении критерия поиска.

  void FindAndShowList()

  {

    string criteria = GetSearchString("List");

    if (criteria != null)

      ShowList(criteria);

  }

Доверьте IntelliSense создать заготовку метода GetSearchString, затем введите код, как показано ниже.

  string GetSearchString (string where)

  {

    activeTable = activeGrid == studsGrid ? ds.Tables[0] : ds.Tables[1];

    int row = 0, col = 0;

    if (activeCell != null)

    {

        row = activeCell.RowIndex;

        col = activeCell.ColumnIndex;

    }

    string

        colName = activeTable.Columns[col].ColumnName,

        text = Trim(comboFind.Text.ToUpper());    // Искомый текст

    bSearchChanged = formFound == null || !formFound.Visible

      || findWhat != text

      || searchGrid != activeGrid

      || searchControl != where

      || searchColumnName != colName;

    if (bSearchChanged)

    {

        searchGrid = activeGrid;

        searchColumnName = colName;

        findWhat = text;

        searchControl = where;

        return GetSelectCriteia();

    }

    return null;

  }

Параметр where и переменная searchControl пока не нужны, но они понадобятся позже, когда мы будем искать строки таблицы с помощью класса DataView. Сейчас мы собираемся показать результат поиска в элементе ListView. Затем мы отобразим результат поиска в элементе DataGridView, привязав его к отфильтрованным данным объекта DataView. Вот тогда и вступят в игру параметр where и переменная searchControl.

Флаг bSearchChanged используется, как признак необходимости повторить (обновить) поиск. Как видите, это условие зависит от многих факторов, как то: исчезла вспомогательная форма, изменился искомый текст, изменилась активная таблица, изменилась активная колонка.

Следующий метод производит отбор строк активной таблицы соответственно критерию. Он делает это путем вызова знакомого вам метода Select класса DataTable, то есть осуществляет поиск в памяти.

  void ShowList(string criteria)

  {

    DataRow[] rows = null;

    try

    {

      rows = activeTable.Select(

        activeTable.Columns[activeCell.ColumnIndex].ColumnName   + criteria);

    }

    catch (Exception ex)

    {

      MessageBox.Show(ex.Message);

      DisposeFormFound();

      return;

    }

    if (rows.Length != 0)

    {

      if (!comboFind.Items.Contains(comboFind.Text))

        comboFind.Items.Add(comboFind.Text);

      FillList(rows, comboFind.Text);

      bSearchChanged = false;

    }

    else

      DisposeFormFound();

  }

Критерий фильтрации, подаваемый на вход метода Select, зависит от активной колонки активной таблицы, поэтому мы вычисляем его таким образом.

activeTable.Columns[activeCell.ColumnIndex].ColumnName + criteria

В случае неудачи поиска окно вспомогательной формы следует уничтожить. Это выполнит следующий метод.

  void DisposeFormFound()

  {

    if (formFound != null)

      formFound.Dispose();

    sNotFound.Visible = true;

  }

Рассмотрим код метода FillList, который помещает результат (массив строк, или объектов DataRow) в список — элемент управления вида ListView. Для этой цели мы могли бы воспользоваться более удобным элементом — DataGridView, но, когда нет необходимости редактировать данные, то ListView оказывается вполне приемлемым, и вам надо приобрести опыт его использования.

  void FillList(DataRow[] rows, string text)

  {

    ListView list = new ListView();

    list.View = View.Details;

    list.FullRowSelect = true;

    list.GridLines = true;

    int listWidth = 0;

    foreach (DataGridViewColumn col in activeGrid.Columns)

    {

      int w = col.Width + 4;

      list.Columns.Add(col.HeaderText, w);

      listWidth += w;

    }

    foreach (// Здесь ваш код По всем строкам rows)

    {

      ListViewItem item = new ListViewItem(row["ID"].ToString());