2

我是.net 初学者。我正在读取一个XML 文件并将其显示在两个组合框中,即cbProductcbBrandName

我需要cbBrandNamecbProduct.

我实现了以下代码:

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. 如何使其仅显示链接到 .xml 文件中选定的“产品名称”列的文本值cbProduct

请帮忙。
提前致谢。

4

2 回答 2

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>());
于 2012-10-06T07:36:45.600 回答
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。”

于 2012-10-07T08:06:43.033 回答