【问题标题】:Add only one XML element into combobox仅将一个 XML 元素添加到组合框中
【发布时间】:2020-08-24 11:18:19
【问题描述】:

我正在使用 c# 在 Visual Studio WPF 中制作一个带有一些复选框和过滤选项的小应用程序。

对于我的数据,我有一个包含各种位置的 XML 文档,如下所示:

<Cities>
    <Location>
        <Name>Gava</Name>
        <City>Barcelona</City>
        <Community>Catalonia</Community>
        <Checked>False</Checked>
      </Location>
      <Location>
        <Name>Castelldefels</Name>
        <City>Barcelona</City>
        <Community>Catalonia</Community>
        <Checked>False</Checked>
      </Location>
      <Location>
        <Name>San Juan</Name>
        <City>Alicante</City>
        <Community>Valencia</Community>
        <Checked>False</Checked>
      </Location>
      <Location>
        <Name>Benidorm</Name>
        <City>Alicante</City>
        <Community>Valencia</Community>
        <Checked>False</Checked>
      </Location>
      <Location>
        <Name>Sagunto</Name>
        <City>Valencia</City>
        <Community>Valencia</Community>
        <Checked>False</Checked>
      </Location>
</Cities>

有了这个,我用这个函数填充了一个带有复选框的列表视图:

XDocument xdoc = XDocument.Load("Data.xml");

private void PopulateLocationList()
        {
            foreach(var elem in xdoc.Descendants("Location"))
            {
                ListView1.Items.Add(new CheckBox { Content = elem.Element("Name").Value, IsChecked = Convert.ToBoolean(elem.Element("Checked").Value) });
            }
        }

我现在想做的是用 City 名称填充 ComboBox,但 City 值只出现一次。 我尝试了上面相同的功能,更改了一些名称,如下所示:

foreach(var elem in xdoc.Descendants("Location"))
            {
                ComboBox1.Items.Add(new ComboBoxItem { Content = elem.Element("City").Value });
            }

但这样做是获取所有City 值并填充ComboBox。我想要的是如果有一个重复的值(例如两个巴塞罗那),只在组合框中显示一个。我只是想不出该怎么做。

提前感谢任何回复的人。我仍然是所有这些编程事物的初学者,没有接受过正式培训,只是按照互联网上的教程进行操作,有时会变得像这样很棘手。

编辑:我知道我可以在设计器中手动执行此操作,甚至可以在我的 xml 文档中为城市使用单独的部分,但我想这样做以便我可以重复使用一些 i 元素,例如 Listview 和 Comboboxes

【问题讨论】:

    标签: c# xml wpf visual-studio


    【解决方案1】:

    为了便于阅读,我在 foreach 中放置了 distinct。但它可能位于 xdoc 语句的末尾,在 Select 之后。

    var cities = xdoc.Descendants("Location").Select(o => o.Element("City").Value);
    
    foreach (var city in cities.Distinct())
    {
        ComboBox1.Items.Add(new ComboBoxItem { Content = city });
    }
    

    // o => o.Elements 和下面的一样

    void MainMethod()
    {
        var cities = xdoc.Descendants("Location").Select(SelectCity);
    
        foreach (var city in cities.Distinct())
        {
            ComboBox1.Items.Add(new ComboBoxItem { Content = city });
        }
    }
    
    string SelectCity(XElement location)
    {
        return location.Element("City").Value;
    }
    

    查看 linq 语句(可能很烧脑)。漂亮的小备忘单页面:https://linqsamples.com/

    将 select 视为只返回一个元素的 foreach。 lambda 符号 '=>' 之后的 o => 是否与“城市中的 var city”相同,这正是您想要返回的内容。 (这实际上并不是它在做什么,但会让这个例子更容易理解)。

    【讨论】:

    • o 只是一个别名,与 foreach 中的“var city”相同。所以 o 可以是位置,所以 location => location.Element("City").
    • 您好,感谢您的回答!我试过了,我现在得到的是只有一个字母的 ComboBoxItems
    • 听起来 Select 只返回一个项目......它通常不会。所以当你到达你的 foreach 时,你实际上是在一个字符串上循环。这就是你让角色通过的原因。
    • 啊,我用 SelectMany 代替 Select 试过了。使用 Select 可以正常工作!太感谢了! :)
    • 那是我的错。我第一次重新阅读它并意识到我使用了错误的方法:D
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-23
    • 2017-05-04
    • 2022-01-13
    • 1970-01-01
    • 2019-10-14
    • 1970-01-01
    相关资源
    最近更新 更多