【问题标题】:C# Filter Listbox From ComboBox Selection Using LinQC# 使用 LinQ 从组合框选择中过滤列表框
【发布时间】:2019-05-09 07:07:26
【问题描述】:

我有一个名为 lstTickets 的列表框和一个名为 cboFilter 的组合框。我正在尝试根据组合框中的 ticket.District 过滤列表框中的项目。因此,例如,如果我从组合框中选择,是列表框中唯一的团队。任何帮助表示赞赏。

 List<Ticket> = new List<Ticket>()
    {
        new Ticket { Name = "Arsenal", Badge = "images/arsenal.jpg", Price = 900, Stadium = "emirates.jpg", District = "London" },
        new Ticket { Name = "Tottenham Hotspur", Badge = "images/tottenham.jpg", Price = 850, Stadium = "tottenham.jpg", District = "" },
        new Ticket { Name = "Manchester United", Badge = "images/.png", Price = 1000, Stadium = "oldtrafford.jpg", District = "" },
    };

 private void cboFilter_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
       var query = from Ticket in tickets where cboFilter.SelectedItem.ToString() == Ticket.District select Ticket;

        lstTickets.ItemsSource = null;
        lstTickets.Items.Clear();

        List<Ticket> tmp = new List<Ticket>();

        foreach (var tickets in query)
        {
            tmp.Add(tickets);

        }
        lstTickets.ItemsSource = tmp;

    }



                        <Image Width="200" Height="150" HorizontalAlignment="Left" Source="{x:Bind Badge }" />
                        <TextBlock FontSize="22" HorizontalAlignment="Left" Text="{x:Bind Name}" Style="{StaticResource HeaderTextBlockStyle}"/>
                        <TextBlock FontSize="16" HorizontalAlignment="Left"> € <Run Text="{Binding Price}" /></TextBlock>
                    </StackPanel>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>

编辑:在 mainpage.cs 中填充组合框

private void myGrid_Loaded(object sender, RoutedEventArgs e)
    {
    }

【问题讨论】:

  • 您已经为此编写了代码。您面临的问题是什么?
  • 查询无效。我相信错误是 cboFilter.Selecteditem.ToString() == Ticket.District。如果我写 Ticket.District == "manchester" 它可以工作,但我不想像那样硬编码它
  • 你能分享填充cboFilter的代码吗?看起来 cboFilter.SelectedItem.ToString() 的值不正确

标签: c# linq xaml combobox listbox


【解决方案1】:

看起来 ToString() 对所选项目不起作用。

var searchTerm=  cboFilter.SelectedItem.ToString();
var query = from Ticket in tickets where Ticket.District == term  select Ticket;

确保在搜索词处设置断点以查看其是否正确

但我想我知道你的问题,所选项目将返回整个对象,所以请执行以下操作

var selectedTicked=  cboFilter.SelectedItem as Ticket;
var searchTerm= selectedTicket.District 
    var query = from Ticket in tickets where Ticket.District == term  select Ticket;

【讨论】:

  • 这不起作用,当在组合框中选择一个项目时,列表框仍然显示为空
  • 我很抱歉误解了这个问题,以为你想排序你的意思是过滤器:(
  • @ChetanRanpariya 你是对的,误解了这个问题
  • selectedTicket 和 SearchTerm 调试时为空值。还得到一个“对象引用未设置为对象的实例。”选择组合框项时出错
【解决方案2】:

尝试首先检查您在 cboFilter.SelectedItem 中有一个实际值,然后如果您使用小写比较这些值。我更喜欢使用 System.Linq,所以我修改了您的查询以使用它:

private void cboFilter_SelectionChanged(object sender, SelectionChangedEventArgs e)
{

   var comboBoxItem = cboFilter.SelectedItem as ComboBoxItem;

   if(comboBoxItem == null) return; // or log an error here or something if it should not be empty.

   var query = tickets.Where(t => t.District.ToLower() == comboBoxItem.Content.ToString().ToLower());

    lstTickets.ItemsSource = null;
    lstTickets.Items.Clear();

    List<Ticket> tmp = new List<Ticket>();

    foreach (var tickets in query)
    {
        tmp.Add(tickets);

    }
    lstTickets.ItemsSource = tmp;

}

【讨论】:

  • if() 语句返回false,查询返回null。
  • @user10760051 - 那么当您调试 cboFilter.SelectedItem.ToString() 的值是多少?如果您不确定如何调试,我很乐意与您讨论。
  • 当我从组合框中选择伦敦时,显示的值为 {Windows.UI.Xaml.Controls.ComboBoxItem}
  • 如果 SelectedItem 是 ComboBoxItem,您是否尝试过投射到 Ticket 并加入 District 属性?
  • @user10760051 - 已更新。我不知道您正在使用 Xaml。您需要 Content 属性,并且需要先将其转换为 comboBoxItem。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-18
相关资源
最近更新 更多