2014-08-27 3 views
-1

У меня есть два datagridviews на winform. Первый содержит столбец идентификатора. Я хочу выбрать строку в этом datagridview и иметь второе обновление dgv на основе этого идентификатора. Второй dgv связан с XML и по умолчанию загружает все узлы с именем «Продукт». XML выглядит так:Обновить datagridview из строки нажмите на другой datagridview

<Class1> 
    <Product .... /> 
    <Product .... /> 
</Class1> 
<Class2> 
    <Product .... /> 
    <Product .... /> 
</Class2> 

Второй dgv загружает все узлы с именем Product правильно, все внутри всех узлов Classx. Я установил событие на первом datagridview и смог зафиксировать идентификатор и сузить набор результатов. Если я нажимаю на идентификатор строки «1» в первом dgv, мне нужен второй 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, чтобы показать только товары в Class ID # выбранного в первом DGV?

Дополнительная информация: Новое для LINQ to XML, но попробовал что-то вроде этого и данных по-прежнему нет. «Класс является атрибутом на узле продукта, и если он совпадает с 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; 
+0

что делает **» это не работает» ** означает? – Vland

+0

Почему вы используете '.Attribute (« Class »). Значение«? »Я не вижу никакого атрибута в вашем определении xml. – Vland

+0

. Как вы думаете,« это не работает »? Читайте вопрос, это говорит «нет данных» в dgv. – Blaze

ответ

0

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(); 
     } 
    } 
+0

Проблема и разрешение не могут быть более ясными. – Blaze

Смежные вопросы