簡體   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