Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用组合框过滤XML(在列表框中)?_C#_Xml_Winforms_Combobox_Listbox - Fatal编程技术网

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

C# 如何使用组合框过滤XML(在列表框中)?,c#,xml,winforms,combobox,listbox,C#,Xml,Winforms,Combobox,Listbox,我需要编写一个switch语句,通过使用组合框过滤XML数据。我想(在某个时候)添加第二个组合框进行过滤。我真的很难弄明白这一点,所以来寻求帮助。该应用程序是一个小动物救援应用程序。我想通过(组合框1)“全部”、“狗”和“猫”进行过滤。最后添加“Baby”、“成人”和“Senior”作为第二个组合框 以下是我的XML的外观: <?xml version="1.0" encoding="utf-8"?> <Animals> <Animal> <Nam

我需要编写一个switch语句,通过使用组合框过滤XML数据。我想(在某个时候)添加第二个组合框进行过滤。我真的很难弄明白这一点,所以来寻求帮助。该应用程序是一个小动物救援应用程序。我想通过(组合框1)“全部”、“狗”和“猫”进行过滤。最后添加“Baby”、“成人”和“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文档填充我的列表框(这也是上面的“全部”):

var an=XElement.Load(@“Animals.xml”)
.后代(“动物”)
.OrderBy(xe=>(xe.Element(“Name”).Value))
.ToList();
lst.Items.Clear();
foreach(an中的var a)
lstAnimals.Items.Add(新动物()
{
name=a.Element(“name”).Value.ToString(),
类型=一个元素(“类型”)值,
年龄=一个元素(“年龄”)值
});

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

看起来还可以。因此,您的动物列表中有动物对象,它们有名称、类型和年龄。
下面是一些伪代码和示例:

您要做的是填充组合框,这取决于另一个组合框,例如可能有“全部”、“婴儿”、“成人”

您的组合框填充器只需查看“过滤器”组合框的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; }
private void FillItems()
{
Fico=新观察到的集合{“动物一”、“动物二”、“动物三”};
Seco=新的可观察集合{“全部”、“婴儿”};
}
公共可观测集合Fico{get;set;}
公共可观测集合Seco{get;set;}
这将创建2个组合框,其中有3个动物,以及2个可选择的“选项”:“全部”和“婴儿”。
您可以将更改事件挂接到
SecondCombo
上,因此无论何时更改,您都将重新填充
FirstCombo
项,以保存符合所选“过滤器”的动物

默认情况下,您可以使用第一个条目(“本例中的“全部”)或任何您想要的条目(您可以为保存的用户保留该选项,等等……),第一次根据选择的条目填写相应的动物列表



另外,关于多个组合框和linq。

在应用程序中添加两个组合框,并为每个组合框设置项目。然后按如下方式处理组合框2 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
        });
private void组合框2\u SelectedValueChanged(对象发送方,事件参数e)
{
字符串类型=comboBox1.Text;
字符串年龄=comboBox2.Text;
var an=XElement.Load(@“anists.xml”)
.后代(“动物”)
其中(a=>a.Element(“Type”).Value==Type&&a.Element(“Age”).Value==Age)
.OrderBy(xe=>(xe.Element(“Name”).Value))
.ToList();
}
foreach(an中的var a)
lstAnimals.Items.Add(新动物()
{
name=a.Element(“name”).Value.ToString(),
类型=一个元素(“类型”)值,
年龄=一个元素(“年龄”)值
});
当然,您必须验证组合框值,希望我正确回答您的问题=)

为交换机编辑

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;
        }
开关(comboBox1.Text)
{
案例“全部”://无条件
var an=XElement.Load(@“anists.xml”)
.后代(“动物”)
.OrderBy(xe=>(xe.Element(“Name”).Value))
.ToList();
打破
案例“狗”:
var an=XElement.Load(@“anists.xml”)
.后代(“动物”)
其中(a=>a.Element(“Type”).Value=“Dog”)
.OrderBy(xe=>(xe.Element(“Name”).Value))
.ToList();
打破
案例“Cat”:
var an=XElement.Load(@“anists.xml”)
.后代(“动物”)
其中(a=>a.Element(“Type”).Value=“Cat”)
.OrderBy(xe=>(xe.Element(“Name”).Value))
.ToList();
打破
}
你可以用这个逻辑来解释年龄,试试这个

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

好的,这段代码运行得很好,但是我如何把它放到switch语句中呢?我更新了我的答案。但是我不明白为什么需要使用switch语句?那么,baby dog的.Where应该是.Where(a=>a.Element(“Type”).Value=“dog”和&a=>a.Element(“Age”).Value=“baby”)我需要使用switch语句,因为这是赋值的一个要求。什么意思是基于另一个语句填充组合框?我对这一切有点迷茫,因为我是新来的,不太理解。
Var results=lstAnimals.Items.where(x=>(ComboBox1.SelectedItem=="All" ||x.type==ComboBox1.SelectedItem)  && x.Age==ComboBox2.SelectedNode)