繁体   English   中英

如何使用组合框从XML(在列表框中)过滤?

[英]How do I filter from XML(in a listBox) using a combobox?

我需要编写一个switch语句,以使用组合框过滤我的XML数据。 我想添加(在某个时候)第二个组合框进行过滤。 我确实很难解决这个问题,并且已经寻求帮助。 该应用程序是小型动物救援应用程序。 我想按(combobox1)筛选“全部”,“狗”和“猫”。 并最终添加“ Baby”,“ Adult”和“ Senior”作为第二个组合框。

这是我的XML的样子:

<?xml version="1.0" encoding="utf-8"?>
<Animals>
 <Animal>
  <Name>Bruce</Name>
  <Type>Dog</Type>
  <Age>Adult</Age>
 </Animal>
 <Animal>
  <Name>Gizmo</Name>
  <Type>Cat</Type>
  <Age>Senior</Age>
 </Animal>
</Animals>

如果这很重要,这就是我从xml文档填充我的listBox的方式(这也就是上面的“全部”):

var an = XElement.Load(@"Animals.xml")
            .Descendants("Animal")
            .OrderBy(xe => (xe.Element("Name").Value))
            .ToList<XElement>();

        lstAnimals.Items.Clear();

        foreach (var a in an)
            lstAnimals.Items.Add(new Animal()
            {
                name = a.Element("Name").Value.ToString(),
                type = a.Element("Type").Value,
                age = a.Element("Age").Value
            });

我不知道如何过滤它们以及如何在switch语句中用词表达。 如何设置此开关和过滤器? 任何帮助,将不胜感激。 希望我已经问对了这个问题。 :)

在您的应用程序中添加两个组合框,并为每个组合框设置项目。然后处理combobox2 SelectedValueChanged事件,如下所示:

    private void comboBox2_SelectedValueChanged(object sender, EventArgs e)
    {
        string type = comboBox1.Text;
        string age = comboBox2.Text;

        var an = XElement.Load(@"Animals.xml")
        .Descendants("Animal")
        .Where(a=>a.Element("Type").Value == type && a.Element("Age").Value == age)
        .OrderBy(xe => (xe.Element("Name").Value))
        .ToList<XElement>();
    }
      foreach (var a in an)
        lstAnimals.Items.Add(new Animal()
        {
            name = a.Element("Name").Value.ToString(),
            type = a.Element("Type").Value,
            age = a.Element("Age").Value
        });

当然,您必须验证组合框的值,希望我能正确回答您的问题=)

编辑切换

switch (comboBox1.Text)
        {
         case "All" :   //No conditions
            var an = XElement.Load(@"Animals.xml")
        .Descendants("Animal")
        .OrderBy(xe => (xe.Element("Name").Value))
        .ToList<XElement>();
                break;

            case "Dog":
                var an = XElement.Load(@"Animals.xml")
        .Descendants("Animal")
        .Where(a=>a.Element("Type").Value ="Dog")
        .OrderBy(xe => (xe.Element("Name").Value))
        .ToList<XElement>();
                break;

            case "Cat":
                var an = XElement.Load(@"Animals.xml")
        .Descendants("Animal")
        .Where(a=>a.Element("Type").Value ="Cat")
        .OrderBy(xe => (xe.Element("Name").Value))
        .ToList<XElement>();
                break;
        }

你可以用这个逻辑来年龄

好像还可以 因此,您的动物列表中包含动物对象,它们具有名称,类型和年龄。
这是一些伪代码和示例:

您要做的是填充组合框,具体取决于另一个组合框,例如,可能包含“全部”,“婴儿”,“成人”。

您的组合框填充器将仅查看“过滤器”组合框的SelectedItem,并具有如下所示的开关:

if "all"
   { add all animals from list ... }
if "baby" 
   { use linq to add only babies ... }
... rinse and repeat

您的linq可能看起来像:

var valid = (from a in an
            where a.age == ("baby")
            select a);

这应该可以解决问题。


假设下一个XAML:

 <ComboBox Name="FirstCombo" Height="30" VerticalAlignment="Top" ItemsSource="{Binding Fico}"></ComboBox>
 <ComboBox Name="SecondCombo" Height="30" VerticalAlignment="Top" Grid.Column="1"  ItemsSource="{Binding Seco}"></ComboBox>

和以下代码:

private void FillItems()
{
   Fico = new ObservableCollection<string> { "Animal one", "Animal two" , "Animal three"};
   Seco = new ObservableCollection<string> { "All", "Baby" };    
}
public ObservableCollection<string> Fico { get; set; }
public ObservableCollection<string> Seco { get; set; }

这将创建2个组合框,其中包含3种动物以及2个“选项”可供选择:“全部”和“婴儿”。
您可以将change事件挂在SecondCombo ,因此,每当更改事件发生时,您都将重新填充FirstCombo项目,以容纳适合所选“过滤器”的动物。

默认情况下,您可以拥有第一个条目(在本示例中为“ all”),也可以拥有任何想要的条目(您可以保留已保存用户的选项,依此类推……),并且第一次取决于选择的项,相应地填写您的动物清单。


此外, 这是有关多个组合框和linq 的类似问题

尝试这个。

Var results=lstAnimals.Items.where(x=>(ComboBox1.SelectedItem=="All" ||x.type==ComboBox1.SelectedItem)  && x.Age==ComboBox2.SelectedNode)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM