这可以通过使用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文件,所以感谢任何帮助。
答案 0 :(得分:1)
通过将数据仅保留在一个DataGridView
中并隐藏那些与搜索字符串不匹配的行,让我们简化任务。
由于您已将XML
加载到DataTable
并绑定 a DataGridView
,因此我们并不需要在XML
数据..
数据绑定DGVs
的方法是在Filter
上设置DataSource
。为此,我们需要在DataView
和DGV
之间插入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);