2013-10-22 135 views
0

如何基於另一個組合框過濾組合框? ...再次:)Silverlight C#:如何篩選基於另一個組合框的組合框?

我正在寫一個Web應用程序來學習。我使用Visual Studio 2012,Silverlight 5,C#和SQl Server作爲數據源。

我有一個表加載到數據網格和組合框來過濾數據網格。到目前爲止,一切正常。

組合框是「FilterState」和「FilterWaterWay」。請注意,它們不在數據網格中。

我想要選擇一個狀態並重新填充FilterWaterWay,只有這些水道處於狀態。

我見過很多方法來做到這一點,但他們都沒有匹配我的設置。我可能是錯的,只是不知道它。

從學習的角度來看,我想知道如何在以下所有3個查詢數據示例中實現這一點,但我只會解決一個。最後一個是我的最愛。

感謝您的幫助。


我不介意使用下面的加載組合框,過濾與否,但我不能firgure如何

  1. Restirct的GetQuery只有一個場
  2. 作出這樣的場不同

這將所有數據從GetQuery加載到數據網格。

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

DocksGrid.ItemsSource = loadOp.Entities; 

這會將從GetQuery所有數據到DataGrid它被過濾

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]"; 
        } 
       }; 
     } 

DomainService.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; 

回答

0

沒有括號,你就string.Distinct().ToList()(實現IEnumerable<char>,這就是爲什麼那些操作的工作),這會導致List<char>(這是你要找沒有什麼)。您需要添加括號讓您得到不同的水道:

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); 
    } 
} 
+0

好老鼠!這是簡單的方法:)謝謝,蒂姆,如果我能投票你我會的。我會問一個關於爲什麼我甚至應該在這個例子中使用ObservableCollection的問題。看起來我並不需要它。 –

相關問題