【发布时间】:2014-08-27 17:04:58
【问题描述】:
我在一个 winform 上有两个 datagridviews。第一个包含一个 ID 列。我想在该 datagridview 中选择一行并根据该 ID 进行第二次 dgv 更新。第二个 dgv 绑定到 XML,默认加载所有名为“Product”的节点。 XML 如下所示:
<Class1>
<Product .... />
<Product .... />
</Class1>
<Class2>
<Product .... />
<Product .... />
</Class2>
第二个 dgv 正确加载了所有名为 Product 的节点,所有节点都在所有 Classx 节点内。我在第一个 datagridview 上设置了事件,并且可以捕获 ID 并缩小结果集。如果我单击第一个 dgv 中的行 ID“1”,我需要第二个 dgv 来仅加载“Class1”中的产品。这不起作用:
private void dgClasses_CellClick(object sender, DataGridViewCellEventArgs e)
{
DataGridView dgv = sender as DataGridView;
if (dgv == null)
return;
if (dgv.CurrentRow.Selected)
{
string selectedval;
DataGridViewRow row = this.dgClasses.SelectedRows[0];
selectedval = row.Cells["ID"].Value.ToString();
XmlReader xmlFile = XmlReader.Create(txtFileLocation.Text, new XmlReaderSettings());
DataSet dataSet = new DataSet();
dataSet.ReadXml(xmlFile);
dgProducts.DataSource = null;
dgProducts.Refresh();
dgProducts.DataSource = dataSet.Tables["Class" + selectedval + "/Product"];
xmlFile.Close();
}
}
如何刷新第二个 dgv 以仅显示在第一个 dgv 中选择的 Class ID # 中的产品?
更多信息: LINQ to XML 的新手,但尝试了类似的方法,但仍然没有数据。 "Class 是 Product 节点上的一个属性,如果它与 selectedval (ID) 匹配,那么我需要这些记录。
XDocument xml = XDocument.Load(txtFileLocation.Text);
var nodes = (from n in xml.Descendants("Class" + selectedval)
where n.Element("Product").Attribute("Class").Value == selectedval
select n.Element("Product").Descendants().Elements()).ToList();
dgProducts.DataSource = null;
dgProducts.Refresh();
dgProducts.DataSource = nodes;
【问题讨论】:
-
“它不起作用”是什么意思?
-
你为什么使用
.Attribute("Class").Value?我在您的 xml 定义中没有看到任何属性 -
您认为“它不起作用”是什么意思?阅读问题,它在 dgv 中显示“没有数据”。
-
很高兴你把它整理出来,我还是不明白问题是什么,你是怎么解决的,为什么这个问题叫做“从行点击另一个数据网格视图更新数据网格视图”
-
因为这是我试图解决的问题。根据不同 dgv 的行点击更新 dgv。我通过过滤掉不符合特定行的单击事件传递的条件的行来解决它,最初我试图只在数据绑定中返回该行集,但这是行不通的。
标签: c# winforms datagridview