Как сделать поиск в datagridview через textbox?
у меня есть поля в базе данных : фамилия, имя, Отчество, № договора, телефон, email и адрес. на Windows Forms создал датагрид при запуске приложения осуществляется запрос, который показывает всю информацию о контрагенте, и мне нужно сделать поиск, который осуществляется через текстбокс в нем нужно как-то вместить 3 поля из базы данных, т.е. проще говоря мне нужно чтобы пользователь введя ФИО нашел контрагента, но проблема в том что это 3 разных поля, не в одном поле прописано ФИО, а в разных, просто я привык искать в разных, вот и не знаю как можно сделать, попробовал по разному но не получилось( Подскажите пожалуйста как можно это реализовать?
private void textBox3_TextChanged(object sender, EventArgs e)
{
for (int i = 0; i < dataGridView1.RowCount; i++)
{
dataGridView1.Rows[i].Selected = false;
for (int j = 0; j < dataGridView1.ColumnCount; j++)
if (dataGridView1.Rows[i].Cells[j].Value != null)
if (dataGridView1.Rows[i].Cells[j].Value.ToString().Contains(textBox3.Text))
{
dataGridView1.Rows[i].Selected = true;
break;
}
}
}
}
Ответы (1 шт):
Давайте говорящие имена всем своим переменным, в том числе и контролам. Вот что такое textBox3? О чём говорит это имя?
Так как этот текстбокс предназначен для поиска, назовём его SearchTextBox. И так далее.
Навскидку код может выглядеть так. Текст, введённый в поле поиска расщепляем по пробелу, получаем несколько значений. По ним и ищем.
Я использовал row.Cells["FirstName"], row.Cells["LastName"] - явное указание колонок с именем и фамилией, но можно и циклом пробегаться по колонкам.
private void SearchTextBox_TextChanged(object sender, EventArgs e)
{
dataGridView.ClearSelection();
if (string.IsNullOrWhiteSpace(searchTextBox.Text))
return;
var values = searchTextBox.Text.Split(new char[] { ' ' },
StringSplitOptions.RemoveEmptyEntries);
for (int i = 0; i < dataGridView.RowCount - 1; i++)
{
foreach (string value in values)
{
var row = dataGridView.Rows[i];
if (row.Cells["FirstName"].Value.ToString().Contains(value) ||
row.Cells["LastName"].Value.ToString().Contains(value))
{
row.Selected = true;
}
}
}
}
Я не знаю, какой именно поиск вам нужен - точное совпадение всех полей в одной строке или частичное совпадение в разных строках.
Возможно, больше подойдут следующие условия:
if (row.Cells["FirstName"].Value.ToString().Contains(value))
{
row.Cells["FirstName"].Selected = true;
}
if (row.Cells["LastName"].Value.ToString().Contains(value))
{
row.Cells["LastName"].Selected = true;
}
Тут выделяется не строка целиком, а отдельные ячейки.
Или такой вариант:
if (values.Length != 2)
return;
for (int i = 0; i < dataGridView.RowCount - 1; i++)
{
var row = dataGridView.Rows[i];
if (row.Cells["FirstName"].Value.ToString().Contains(values[0]) &&
row.Cells["LastName"].Value.ToString().Contains(values[1]))
{
row.Selected = true;
}
}
Совет: используйте датагрид с двойной буферизацией. Это намного ускоряет его отрисовку.
class DoubleBufferedDataGridView : DataGridView
{
protected override bool DoubleBuffered { get => true; }
}