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

¨  recordStates — определяет состояние (версию) данных, которые необходимо найти. Этот параметр, совместно с первым, задает более сложный критерий отбора записей.

Сейчас мы попробуем использовать эту функцию для поиска строк таблицы. Оживите заглушку метода Find, реагирующего на нажатие кнопки btnFindNext или одноименной команды меню.

void Find()

{

DataRow[] rows = ds.Tables[0].Select();  // Просим выбрать все записи таблицы (SQL запрос)

foreach (DataRow r in rows)

  Debug.WriteLine("Found: " + r["Name"]);

}

Здесь используется самая простая версия метода Select, которая не задает критерия поиска и должна возвратить все строки таблицы. Отладочный код вставлен по причине того, что я не уверен, что все пройдет гладко. Проведите опыт по проверке метода DataTable.Select и убедитесь, что он работает и действительно возвращает массив всех строк таблицы. Исследуйте другие версии метода Select, задавая различные критерии отбора строк. Например, поочередно опробуйте следующие критерии:

DataRow[] rows = ds.Tables[0].Select ("Phone = '430-5125'"); // Задаем критерий отбора

DataRow[] rows = ds.Tables[0].Select ("Addr='Hi st., 30'");  // Другой критерий отбора

DataRow[] rows = ds.Tables[1].Select();// Все записи из второй таблицы. При этом замените имя искомого поля данных на Course

// Просим учесть выбор пользователя

DataRow[] rows = ds.Tables[0].Select ("Name='" + comboFind.Text + "'");

Последний фрагмент предполагает, что перед тем как нажать кнопку Find, вы введете в ToolStripComboBox (полное!) имя искомого студента. Обратите внимание на символы ', которые должны обрамлять значение искомого поля. При работе с этим служебным символом вы также можете использовать тот синтаксис, который был необходим в языке C++:

"Name = \'"+ comboFind.Text + "\'"

но это не обязательно. Опробуйте также более сложные критерии. Например, следующий вызов возвращает все записи таблицы Studs, но при этом они будут отсортированы по полю Name в убывающем (descending) порядке.

DataRow[] rows = ds.Tables[0].Select ("", "Name DESC");

Если надо изменить порядок следования строк, то вместо константы DESC используйте ASC (ascending — возрастающий), но эта установка действует и по умолчанию. Если потребуется найти имя, начинающееся с определенной буквы, то можно использовать оператор сравнения LIKE языка SQL.

DataRow[] rows = ds.Tables[0].Select ("Name LIKE 'C*'");

Этот вызов выберет три строки. Для наших целей можно остановиться на варианте:

DataRow[] rows = ds.Tables[0].Select ("Name LIKE'" + comboFind.Text + "*'");

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

void Find()

{

string what = Trim(comboFind.Text);

if (what == "")

  return;

DataRow[] rows = ds.Tables[0].Select("Name LIKE '" + what + "*'");

if (rows.Length == 0)

{

  sNotFound.Visible = true; // Показываем метку "Not Found"

  return;

}

sNotFound.Visible = false; // Прячем метку "Not Found"

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

  comboFind.Items.Add(what); // Запоминаем искомую строку в ComboBox ObjectCollection

//======= Выделяем первую из найденных строк

studsGrid.CurrentCell = studsGrid.Rows[(int)rows[0][0] - 1].Cells[1];

}

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

Коррекция пользовательского интерфейса