Поиск по DataGridView заполняемая от XML
Есть таблица которая заполняется подобным образом:
DataSet ds = new DataSet();
ds.ReadXml(Properties.Settings.Default.XMLDBFile);
foreach (DataRow item in ds.Tables["Orders"].Rows)
{
int n = dataGridView1.Rows.Add();
dataGridView1.Rows[n].Cells[0].Value = item["Date"].ToString();
dataGridView1.Rows[n].Cells[1].Value = item["Service"].ToString();
dataGridView1.Rows[n].Cells[2].Value = item["Quantity"].ToString();
dataGridView1.Rows[n].Cells[3].Value = item["Status"].ToString();
dataGridView1.Rows[n].Cells[4].Value = item["Sum"].ToString();
dataGridView1.Rows[n].Cells[5].Value = item["Employee"].ToString();
dataGridView1.Rows[n].Cells[6].Value = item["Term"].ToString();
dataGridView1.Rows[n].Cells[7].Value = item["Client"].ToString();
dataGridView1.Rows[n].Cells[8].Value = item["Comment"].ToString();
}
Как это выглядит:
А это подгружаемый xml файл:
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<NewDataSet>
<Orders>
<Date>24.06.2020</Date>
<Service>Услуга 1</Service>
<Quantity>0 шт.</Quantity>
<Status>Новый</Status>
<Sum>0 ₽</Sum>
<Employee>Сотрудник</Employee>
<Term>27.06.2020</Term>
<Client xml:space="preserve"> </Client>
<Comment />
</Orders>
<Orders>
<Date>24.06.2020</Date>
<Service>Услуга 2</Service>
<Quantity>0 шт.</Quantity>
<Status>Отменен</Status>
<Sum>0 ₽</Sum>
<Employee>Сотрудник</Employee>
<Term>27.06.2020</Term>
<Client xml:space="preserve"> </Client>
<Comment />
</Orders>
<Orders>
<Date>24.06.2020</Date>
<Service>Услуга 3</Service>
<Quantity>0 шт.</Quantity>
<Status>Новый</Status>
<Sum>0 ₽</Sum>
<Employee>Сотрудник</Employee>
<Term>27.06.2020</Term>
<Client xml:space="preserve"> </Client>
<Comment />
</Orders>
</NewDataSet>
Хочу сделать поиск по столбцу "Услуга". Вот его код:
private void toolStriptbxSearch_TextChanged(object sender, EventArgs e)
{
DataSet ds = new DataSet();
ds.ReadXml(Properties.Settings.Default.XMLDBFile);
this.dataGridView1.DataSource = ds.Tables["Orders"];
string filterField = "Service";
((DataTable)dataGridView1.DataSource).DefaultView.RowFilter = string.Format("[{0}] LIKE '%{1}%'", filterField, toolStriptbxSearch.Text);
}
Когда я набираю что-то в текстовое поле toolStriptbxSearch поиск работает, но открывается еще одна таблица:

Каким образом это можно исправить?
Ответы (1 шт):
Судя по скриншотам, вы изначально создали колонки в DataGridView (с правильными заголовками на русском).
И сперва вы добавляете значения в ячейки вручную. А потом при поиске уже используете привязку данных к DataSource. При этом автоматически добавляются новые колонки.
Чтобы новые колонки не добавлялись, нужно задать маппинг колонок датагрида к источнику данных. Делается это с помощью свойства DataPropertyName.
Например, так может выглядеть код для колонки с хедером Дата, привязанной к колонке Date в таблице DataTable.
dataGridView1.Columns.Add("Date", "Дата");
dataGridView1.Columns["Date"].DataPropertyName = "Date";
Задайте DataPropertyName для всех колонок. Это можно сделать и в дизайнере.
Код поиска у вас по сути правильный и рабочий, но я бы его немного упростил.
private void toolStriptbxSearch_TextChanged(object sender, EventArgs e)
{
string filterField = "Service";
dataTableOrders.DefaultView.RowFilter =
string.Format("[{0}] LIKE '%{1}%'", filterField, toolStriptbxSearch.Text);
}
Убираем постоянную загрузку данных.
Делаем в классе формы поля:
private DataSet dataSet;
private DataTable dataTableOrders;
В том месте, где осуществляется первоначальная загрузка данных, пишем:
dataSet = new DataSet();
dataSet.ReadXml(Properties.Settings.Default.XMLDBFile);
dataTableOrders = dataSet.Tables["Orders"];
dataGridView1.DataSource = dataTableOrders;
Цикл foreach убираем.
К этим полям теперь можно свободно обращаться во всех методах формы. Что и делается в обработчике события.