Поиск по 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 шт):

Автор решения: Alexander Petrov

Судя по скриншотам, вы изначально создали колонки в 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 убираем.

К этим полям теперь можно свободно обращаться во всех методах формы. Что и делается в обработчике события.

→ Ссылка