如何搜索XML文件并将结果输出到数据网格以进行编辑?

时间:2017-07-06 11:50:59

标签: c# xml datagridview

这可以通过使用SQL来完成,但我想使用XML文件为用户提供这种便利。我可以正常地在数据网格视图中显示数据,但我不知道如何像在SQL数据库中那样搜索它。

我需要做的就是允许此人搜索名称,信息或访问日期,以便将数据放入数据网格视图中。

以下是我的XML代码:

<root>
  <place>
    <Name>home</Name>
    <Location>x-292 z 277</Location>
    <Info>home</Info>
    <Dayvisited>10</Dayvisited>
  </place>
  <place>
    <Name>town</Name>
    <Location>x 990 z-2485</Location>
    <Info>gas station</Info>
    <Dayvisited>12</Dayvisited>
  </place>
  <place>
    <Name>crossing</Name>
    <Location>x 90 z-2998</Location>
    <Info>working stiff</Info>
    <Dayvisited>11</Dayvisited>
  </place>
</root>

这就是我到目前为止将其加载到网格中的方式

ds.ReadXml("Database.xml");
dataGridView1.DataSource = ds.Tables[0];
dataGridView1.Rows[0].Visible = false;

我很擅长使用xml文件,所以感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

通过将数据仅保留在一个DataGridView中并隐藏那些与搜索字符串不匹配的行,让我们简化任务。

由于您已将XML加载到DataTable绑定 a DataGridView,因此我们并不需要在XML数据..

数据绑定DGVs的方法是在Filter上设置DataSource。为此,我们需要在DataViewDGV之间插入DataTable

让我们先用ComboBox DataTable填充Columns

combo_fields.Items.AddRange(ds.Tables[0].Columns.Cast<DataColumn>()
                                .Select(x => x.ColumnName).ToArray());
combo_fields.SelectedIndex = 1;  // start with the Location field

接下来,我们添加TextBox,我们在其中输入搜索文本:

private void tb_filter_TextChanged(object sender, EventArgs e)
{
    string filter = ""; 
    if (tb_filter.Text != "")
        filter = combo_fields.Text + " LIKE '*" + tb_filter.Text + "*'";

    DataView dv = new DataView(ds.Tables[0]);
    dv.RowFilter = filter;
    dataGridView1.DataSource = dv;
}

这就是我们所需要的一切。当然,您可以轻松地改变条件,例如&#39;完全匹配..

您还可以搜索XML数据并隐藏DGV中的行,但它不会比上面的代码更简单,只是更接近原始问题。

以下是搜索XDocument xDoc

的方法
var found = xDoc.Descendants(combo_fields.Text)
                .Where(x => x.Value.Contains( tb_filter.Text))
                .Select(x => x.Value).ToList();

现在,您可以使用strings列表来决定我们将隐藏哪些行:

dataGridView1.CurrentCell = null;  // necessary, so we don't try to hide the current row

foreach(DataGridViewRow row in dataGridView1.Rows)
{
    if (row.Cells[combo_fields.Text].Value != null)
        row.Visible = found.Contains(row.Cells["Location"].Value.ToString());
}

完成后我们可以清除过滤器TextBox以显示所有行,并且我们可以保存数据..:

tb_filter.Text = "";

ds.Tables[0].WriteXml(someFileName);