我是.net初学者。我正在阅读XML file并将其显示在两个组合框中,即。cbProduct
和cbBrandName
我需要在cbBrandName
中显示与cbProduct
中所选文字相关的文字。
我实现了以下代码:
DataSet ds = new DataSet();
ds.ReadXml(@"..\..\stock.xml");
cbProduct.DataSource = ds.Tables[0].DefaultView.ToTable(true, "productname");
cbProduct.DisplayMember = "productname";
cbBrandName.DataSource = ds.Tables[0].DefaultView.ToTable(true, "brandname");
cbBrandName.DisplayMember = "brandname";
上面的代码显示了cbBrandName
中的所有文字值。如何使其仅显示链接到cbProduct
中xml文件的选定“productname”列的文本值。
请帮助。
提前致谢。
答案 0 :(得分:3)
在 LINQ2XML
中XElement doc=XElement.Load(@"..\..\stock.xml");
//put this code in the form_load event
cbProduct.Items.AddRange(doc.Descendants("items").Select(x=>x.Element("productname").Value).ToArray<string>());//adds all products
//put this code in the SelectedIndexChanged event of cbProduct
string product2Search=cbProduct.SelectedItem.ToString();//selected value of cbProduct
cbBrandNamedoc.Items.Clear(); //clears all items in cbBrandNamedoc
cbBrandNamedoc.Items.AddRange(doc.Descendants("items").Where(x=>x.Element("productname").Value==product2Search).Select(y=>y.Element("brandname").Value).ToArray<string>());
答案 1 :(得分:3)
LINQ看起来比它更可怕。在Anirudha的答案中使用了两个部分,我将尝试解释。第一个是.Select(x=>
。这意味着“对于列表中的每件事,用一些东西替换它”。 x表示列表中的每个项目。
例如:
new string[]{"a", "b", "c"}.Select(x=>x.ToUpper());
将{“a”,“b”,“c”}的数组转换为{“A”,“B”,“C”}的数组。它只是说“取出列表中的每一件事,并通过调用它上面的ToUpper()
替换它。
LINQ的另一位是.Where(x=>
。这只是说“给我一个更小的清单,只有这个陈述是真的”。所以
new string[]{"a", "b", "c"}.Where(x=>x == "a");
会为您提供{“a”}的列表。用x == "a"
替换x != "b"
将为您提供{“a”,“c”}的列表。所以在第二段代码中,你说“在我用我的产品名称替换每个项目之前,我想过滤掉任何与我想要匹配的东西不匹配的东西。然后我改变剩下的东西。 “
要将这些应用于代码示例,我将重新格式化行并对其进行注释。
// To set the first combo box:
cbProduct.Items.AddRange( // Add everything we produce from this to the cbProduct list
doc.Descendants("items") // For each thing that represents an "items" tag and it's subtags
.Select(x=>x.Element("productname").Value) // Transform it by getting the "productname" element and reading it's Value.
.ToArray<string>()); // Then convert that into a string[].
// To set the second combo box:
string product2Search=cbProduct.SelectedItem.ToString();// get the currently selected value of cbProduct.
cbBrandName.Items.Clear(); //clears all items in cbBrandNamedoc
cbBrandName.Items.AddRange( // Add everything we produce from this to the cbBrandName list
doc.Descendants("items") // For each thing that represents an "items" tag and it's subtags
.Where(x=>x.Element("productname").Value==product2Search) // Filter our list to only those things where the productname matches what's currently selected in cbProduct (which we just stored)
.Select(y=>y.Element("brandname").Value) // Transform it by getting the "brandname" element and reading it's Value.
.ToArray<string>()); // Then convert that into a string[]
这有用吗?当我自己编写代码时,我喜欢通过将它们放在像这样的单独行来分割长LINQ语句,然后我就可以读到这些行:“我得到一个列表,这是真的,然后选择另一个基于它的东西在它上面,把它变成一个ARRAY。“