[英]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.