【问题标题】:Silverlight C#: How to filter a combobox based on another combobox?Silverlight C#:如何根据另一个组合框过滤组合框?
【发布时间】:2013-10-22 14:21:22
【问题描述】:

如何根据另一个组合框过滤一个组合框? ...再次:)

我正在编写一个网络应用程序来学习。我使用 Visual Studio 2012、Silverlight 5、C# 和 SQl Server 作为数据源。

我有一个表加载到数据网格和组合框来过滤数据网格。到目前为止,一切正常。

组合框是“FilterState”和“FilterWaterWay”。请注意,它们不在数据网格中。

我想选择一个州,然后只用该州的那些水道重新填充 FilterWaterWay。

我已经看到了很多方法来做到这一点,但它们似乎都不符合我的设置。我可能是错的,只是不知道而已。

从学习的角度来看,我想知道如何在以下所有 3 个查询数据示例中实现这一点,但我只会满足于一个。最后一个是我最喜欢的。

感谢所有帮助。


我不介意使用以下内容加载组合框,无论是否过滤,但我不知道如何

  1. 将 GetQuery 限制为仅一个字段
  2. 使该字段与众不同

这会将所有数据从 GetQuery 加载到数据网格。

LoadOperation<MASTER_DOCKS> loadOp = this._DocksContext.Load(this._DocksContext.GetMASTER_DOCKSQuery());

DocksGrid.ItemsSource = loadOp.Entities;

这会将 GetQuery 中的所有数据在过滤后加载到数据网格中

EntityQuery<MASTER_DOCKS> query = _DocksContext.GetMASTER_DOCKSQuery();

query = query.Where(s => s.WTWY_NAME == WaterwaytoFilterBy && s.STATE == StateToFilterBy);

LoadOperation<MASTER_DOCKS> loadOp = this._DocksContext.Load(query);

DocksGrid.ItemsSource = loadOp.Entities;

这就是我当前加载组合框的方式。这适用于负载,但我不知道如何过滤。 DomainService.cs 不知道我想用作此组合框 (FilterWaterway) 过滤器的其他组合框 (FilterState)。

如果我可以在 xaml 中查询 ObservableCollection,我也许可以让它工作,但它似乎有点笨重。

改编自http://www.jonathanwax.com/2010/10/wcf-ria-services-datagrid-filters-no-domaindatasource-2/

XAML =

private ObservableCollection<string> waterWayFilterList;
    public ObservableCollection<string> WaterWayFilterList
    {
        get { return waterWayFilterList; }
        set { waterWayFilterList = value; }
    }


    private void DoPopulateFilter()
      {
             //Call Invoke Method to get a list of distinct WaterWays

       InvokeOperation<IEnumerable<string>> invokeOp = _DocksContext.FillWaterWayList();
           invokeOp.Completed += (s, e) =>
               {
                    if (invokeOp.HasError)
                    {
                        MessageBox.Show("Failed to Load Category Filter");
                    }
                    else
                    {
                        //Populate Filter DataSource
                        WaterWayFilterList = new ObservableCollection<string>(invokeOp.Value);

                        //Add a Default "[Select]" value
                        WaterWayFilterList.Insert(0, "[Select WaterWay]");


                        FilterWaterWay.ItemsSource = WaterWayFilterList;
                        FilterWaterWay.SelectedItem = "[Select WaterWay]";
                    }
                };
        }

域服务.cs =

[Invoke]
        public List<string> FillWaterWayList()
        {

            return (from r in ObjectContext.MASTER_DOCKS

                    select r.WTWY_NAME).Distinct().ToList();

        }

这是我目前为止最接近的,而且看起来很简单。

它没有返回错误,但显示的结果为 System.Collections.Generic.List'1[System.Char]

下拉列表中的记录数是正确的,这让我认为它在正确的轨道上。 只有显示的内容是错误的。可能是选角问题?

我仍然需要从“TX”所在的 FilterState 组合框中获取结果。

var filter = from r in _DocksContext.MASTER_DOCKS
          where r.STATE.Equals("TX")
          select r.WTWY_NAME.Distinct().ToList();


MyComboBox.ItemsSource = filter;

【问题讨论】:

    标签: c# wpf datagrid combobox silverlight-5.0


    【解决方案1】:

    没有括号,您在 string 上执行 .Distinct().ToList()(它实现了 IEnumerable&lt;char&gt;,这就是这些操作起作用的原因),这会导致 List&lt;char&gt;(这不是您的意思寻找)。您需要添加括号,以便获得不同的水道:

    var filter = (from r in _DocksContext.MASTER_DOCKS
              where r.STATE.Equals("TX")
              select r.WTWY_NAME).Distinct().ToList();
    

    请注意,如果两条水道可能具有相同的名称,但实际上是不同的,则您需要选择不同的r,然后以某种方式在下拉列表中区分它们,例如

    var filter = (from r in _DocksContext.MASTER_DOCKS
              where r.STATE.Equals("TX")
              select r).Distinct().ToList();
    
    // generated classes are partial, so you can extend them in a separate file
    public partial class MASTER_DOCKS
    {
        // the dropdown uses the ToString method to show the object
        public override string ToString()
        {
            return string.Format("{0} ({1})", WTWY_NAME, ID);
        }
    }
    

    【讨论】:

    • 好老鼠!这很容易:) 谢谢你,蒂姆,如果我能投票给你,我会的。我会问另一个问题,为什么我应该在这个例子中使用 ObservableCollection。看来我不需要它。
    猜你喜欢
    • 2013-04-25
    • 2013-03-10
    • 1970-01-01
    • 1970-01-01
    • 2014-07-01
    • 1970-01-01
    • 2013-06-18
    • 1970-01-01
    • 2013-01-23
    相关资源
    最近更新 更多