我需要编写一个switch语句,使用组合框过滤我的XML数据。我想添加(在某些点)第二个组合框来过滤。我很难搞清楚这一点,并寻求帮助。该应用程序是一个小动物救援应用程序。我想过滤(combobox1)“All”,“Dog”和“Cat”。并最终添加“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的方式(这也是上面的“All”):
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语句中说出它。如何设置此开关和过滤器?任何帮助,将不胜感激。希望我能正确地提出这个问题。 :)
答案 0 :(得分:1)
在你的应用程序中添加两个组合框,并为每个组合框设置项目。然后像这样处理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;
}
您可以将此逻辑用于年龄
答案 1 :(得分:0)
好像没问题。因此,您的动物清单中有动物物品,其名称,类型和年龄 这是一些伪代码和示例:
你要做的是填充组合框,取决于另一个,例如可能有“全部”,“宝贝”,“成人”。
你的组合框人群只会查看“过滤器”组合框的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个“选项”可供选择:“all”和“baby”。
您可以在SecondCombo
上挂钩更改事件,因此无论何时更改,您都会重新填充FirstCombo
项目,以保留符合所选“过滤器”的动物。
您可以将第一个条目(此示例中的“全部”)或任何您想要的内容(您可以保留已保存用户的选项等等)默认为第一次,具体取决于哪个被选中,相应填写你的动物名单。
此外,here's a similar question关于多个组合框和linq。
答案 2 :(得分:0)
试试这个。
Var results=lstAnimals.Items.where(x=>(ComboBox1.SelectedItem=="All" ||x.type==ComboBox1.SelectedItem) && x.Age==ComboBox2.SelectedNode)