簡體   English   中英

WinForms,DataGridView:使用來自多個節點的屬性過濾XML數據

[英]WinForms, DataGridView: Filtering XML data using attributes from multiple nodes

我有一個類似於以下格式的XML數據文件:

<?xml version="1.0" standalone="yes"?>
<Root>
  <FirstLevel Id="1">
    <SecondLevel Id="1">
      <ThirdLevel Id="1">
        <DataElement Id="1" Data="hello" />
        <DataElement Id="2" Data="world" />
      </ThirdLevel>
      <ThirdLevel Id="2">
        <DataElement Id="1" Data="blablabla" />
        <DataElement Id="2" Data="blablabla" />
      </ThirdLevel>    
    </SecondLevel>
    <SecondLevel Id="2">
      <ThirdLevel Id="1">
        <DataElement Id="1" Data="asdf" />
        <DataElement Id="2" Data="qwerty" />
      </ThirdLevel>
      <ThirdLevel Id="2">
        <DataElement Id="1" Data="gggggg" />
        <DataElement Id="2" Data="dddddd" />
      </ThirdLevel>    
    </SecondLevel>
  </FirstLevel>
</Root>

我正在嘗試使用綁定到此XML文件的DataGridView創建WinForms應用程序。 並根據選擇的導航參數在網格中顯示以下內容。 例如,如果用戶選擇所有Id為1的FirstLevel,SecondLevel和ThirdLevel導航,則僅應顯示以下兩行,並且能夠寫回對XML的任何更改:

Id   Data
----------
1    hello
2    world

到目前為止,我只能顯示所有行(數據表):

Id  Data
---------
1   hello
2   world
1   blablabla
2   blablabla
1   asdf
2   qwerty
... etc

使用以下代碼:

DataSet dataSet = new DataSet();
dataSet.ReadXML("Data.xml");
DataView dataView = new DataView(dataSet.Tables["DataElement"]);
BindingSource source = new BindingSource();
source.DataSource = dataView;
dataGridView1.DataSource = source;

如上所述,如何過濾數據以僅顯示2行? 謝謝!

更新:

感謝康拉德的幫助! 但是,我仍在嘗試找出如何在這三個級別之間“導航”,因為添加DataMember並不會完全添加過濾。 因此,要能夠顯示FirstLevel Id = 2,SecondLevel Id = 1,ThirdLevel Id = 5(或類似值)的條件的數據,我是否必須將所有三個值相加:

DataView dataView = new DataView(dataSet.Tables["FirstLevel_SecondLevel_ThirdLevel"]);

然后添加類似於以下內容的RowFilter:

dataView.RowFilter = "Id = '2'";

(但是這里的其他級別呢?)

然后如下修改DataMember:

source.DataMember = "FirstLevel_SecondLevel_ThirdLevel_DataElement";

它對我來說還不太有效。 我真的只是在這里違背流程嗎,這不是WinForms中應該如何進行XML數據編輯的方法嗎? 謝謝!

您可以在where子句中過濾數據,以傳遞實際的元素名稱,並在過濾后獲取確切的數據。

var data =(從XDocument.Load(_pathXML).Descendants(“ ThirdLevel”)中的d獲得,其中d.Attribute(“ Id”)。Value == 1選擇d;

現在您可以顯示數據

          if (_appNme.Any())
          {
              foreach (var item in data)
              {
                  MessageBox.Show(_appNme.Elements("Id").Single().Value);
                  MessageBox.Show(_appNme.Elements("Data").Single().Value);
              }

          }

嘗試使用XPath和Linq to XML。 假設XML位於字符串形式的XML中:

           var doc = XDocument.Parse(xml);
            var firstLevel = "1";
            var secondLevel = "1";
            var thirdLevel = "1";
            var query = string.Format("/Root/FirstLevel[@Id={0}]/SecondLevel[@Id={1}]/ThirdLevel[@Id={2}]/DataElement", firstLevel, secondLevel, thirdLevel);
            var results = (from i in doc.XPathSelectElements(query)
                           select new { Id = i.Attribute("Id").Value, Data = i.Attribute("Data").Value }).ToList();
            foreach (var item in results)
            {
                Console.WriteLine("{0} - {1}", item.Id, item.Data);
            }

更新沒有關系“ FirstLevel_SecondLevel_ThirdLevel”,這就是為什么不起作用。 您可以通過檢查DataSet.Relations集合來找出存在的那些。

當您擁有多個級別時,您需要為每個級別創建一個視圖。

        DataView firstDataView = new DataView(dataSet.Tables["FirstLevel"]);
        firstDataView.RowFilter = "Id = 1";


        DataView secondDataView  = firstDataView[0].CreateChildView("FirstLevel_SecondLevel");
        secondDataView.RowFilter = "Id = 2";

        DataView thirdDataView = secondDataView[0].CreateChildView("SecondLevel_ThirdLevel");
        DataView dataElement = thirdDataView[0].CreateChildView("ThirdLevel_DataElement");



        BindingSource source = new BindingSource();

        source.DataSource = dataElement;

        dataGridView1.DataSource = source;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM