从行更新数据网格视图单击另一个数据网格视图

本文关键字:网格 视图 数据 数据网 另一个 单击 更新 | 更新日期: 2023-09-27 18:19:55

我在一个winform上有两个数据网格视图。第一个包含一个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中选择的类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;

从行更新数据网格视图单击另一个数据网格视图

RowFilter工作得很好!

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);
            DataView dvClass = dataSet.Tables["Product"].DefaultView;
            dvClass.RowFilter = "Class=" + "'" + selectedval + "'";
            dgProducts.DataSource = dvClass;
            xmlFile.Close();
        }
    }