【问题标题】:How can I search an XML file and output the results to data grid for editing?如何搜索 XML 文件并将结果输出到数据网格进行编辑?
【发布时间】:2017-07-06 11:50:58
【问题描述】:

这可以通过使用 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 文件的新手,因此不胜感激。

【问题讨论】:

  • 您可以尝试使用 LINQtoXML 库,您可以在其中进行类似于 SQL 数据库的查询。只需将 xml 加载到 XDocument 类并运行 LINQ 查询
  • 到目前为止,您所做的一切都很完美。 Root 是DataSet 的名称。Place 是第一个Datatable 的表名。列名称是地点子项的标记名称。所以你可以使用 ds.Tables["place"] 代替 ds.Tables[0]。
  • 我正在查看 LINQ,但我找不到任何人以我可以使用它的方式解释它
  • 搜索位置:XDocument doc = XDocument.Parse(yourXmlText); var f = doc.Descendants("Location").Where(x =&gt; x.Value.Contains(yourSearchText)).ToList();
  • @TaW 当我尝试它告诉我。根级别的数据无效。第 1 行,位置 1。我做错了吗?

标签: c# xml datagridview


【解决方案1】:

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

由于您已经将XML 加载到DataTable绑定 DataGridView 到它,我们实际上不需要在XML 数据中搜索..

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

让我们首先用DataTableColumns 填充ComboBox

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;
}

这就是我们真正需要的。当然,您可以轻松地将条件从“喜欢”更改为完全匹配。


您也可以在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);

【讨论】:

  • 非常感谢您的帮助。 iv 没见过有人解释这么多。 iv 刚刚看到了一些信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-26
  • 2018-11-20
相关资源
最近更新 更多