Достаточно часто необходимо произвести поиск по значению определенной ячейки в DataGridView. Обычно это дело сводится к поиску по связанному объекту DataTable. Но сегодня мы поговорим именно о поиске в самом контроле DataGridView.
Имеется следующая форма:

На ней размещены myDataGridView с привязкой к myDataTable, myTextBox и myButton.
Текстовое поле принимает искомое значение для столбца Name, кнопка выполняет поиск и выделяет первую найденную строку, которая соответствует критерию поиска.
Обработчик события следующий:
private void myButton_Click(object sender, EventArgs e)
{
string selectString =
"Name Like '%" + myTextBox.Text.Trim() + "%'";
DataRowCollection allRows =
((DataTable)myDataGridView.DataSource).Rows;
DataRow[] searchedRows =
((DataTable)myDataGridView.DataSource).
Select(selectString);
int rowIndex = allRows.IndexOf(searchedRows[0]);
myDataGridView.CurrentCell =
myDataGridView[0,rowIndex];
}
Сначала определяем фильтр selectString. Затем получаем все строки из источника данных. Потом, с помощью метода Select, среди них находим те, что удовлетворяют условию. Затем, в полученном масиве выбираем первый элемент-строку и получаем для неё индекс, под которым данная строка размещена в myDataTable. Последняя операция назначает текущую ячейку в myDataGridView используя полученный индекс.
Почти вся работа велась на контроле DataTable. Вы скажете, а как же поиск по самому DataGridView? Да, поиск выполнялся по источнику привязки, но результат этой работы отображается в виде динамического назначения текущей ячейки в DataGridView.
Если все таки необходимо «бегать» по гриду, тогда вот приемлемый вариант:
private void myButton_Click(object sender, EventArgs e)
{
for (int i=0; i < myDataGridView.RowCount; i++)
if (myDataGridView[1, i].FormattedValue.ToString().
Contains(myTextBox.Text.Trim()))
{
myDataGridView.CurrentCell = myDataGridView[0, i];
return;
}
}
Но в этом случае также будет выводится только первая найденная строка.
Что бы дать возможность перемещаться по найденным строкам, введите переменную уровня класса, к примеру i, а в цикле выполните маленькие изменения:
int i;
private void myButton_Click(object sender, EventArgs e)
{
for (; i < myDataGridView.RowCount;)
if (myDataGridView [1, i].FormattedValue.ToString().
Contains(myTextBox.Text.Trim()))
{
myDataGridView.CurrentCell = myDataGridView[0, i];
if (i < myDataGridView.RowCount-1)
i++;
else
i = 0;
return;
}
}
Обращаю ваше внимание, что если для элемента DataGridView установлена возможность добавлять строки, то в условии if (i < myDataGridView.RowCount-1) следует единичку заменить на двойку, что б не учитывать последнюю пустую строку вставки новых данных: if (i < myDataGridView.RowCount-2)