2012-04-23 62 views
2

我有一個類,ExpenseItem和一個基於該類的列表。將查詢結果返回給列表框

我目前正在設計一個帶有組合框的窗體,它允許我選擇特定類型的ExpenseItem Trip,並在列表框中顯示所有結果。

表單代碼(tripSelect是組合框和listExpenses是列表框):

private void LoadExpenseList() 
    { 
     tripSelect.Items.Clear(); 
     var dateSorted = 
      from e in roster 
      group e by e.Trip into tripGroup 
      select new { Trip = tripGroup.Key }; 
     foreach (var e in dateSorted) 
      tripSelect.Items.Add(e.Trip); 
    } 

    private void LoadExpenseDetail() 
    { 
     listExpenses.Items.Clear(); 
     var dateSorted = 
      from e in roster 
      orderby e.Trip 
      select e; 
     foreach (var e in dateSorted) ; 
    } 

    private void ExpenseRecorderForm_Load(object sender, EventArgs e) 
    { 

    } 

    private void tripSelect_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     selectedExpense = (ExpenseItem)roster.ToFind((string)tripSelect.SelectedItem); 
     listExpenses.Items.Add(selectedExpense); 
    } 


    private void listExpenses_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     tripTextBox.Text = selectedExpense.Trip; 
     tripTextBox.Enabled = false; 
     descriptionTextBox.Text = selectedExpense.Description; 
     amountTextBox.Text = selectedExpense.Amount.ToString(); 
     paymentMethodTextBox.Text = selectedExpense.PaymentMethod; 
     dateExpenseTimePicker.Value = selectedExpense.Date; 
     dateExpenseTimePicker.Enabled = true; 
     noteTextBox.Text = selectedExpense.Note; 
    } 

回答

1

我不能編寫像myVariable.Where();因爲它不是IEnumerable

我真的不明白你的意思是什麼。

至於錯誤,它說你不能從IEnumerable投到ExpenseItem。您必須像最後一樣應用它,並返回該項目而不是IEnumerable。我只想跳過Where條款並直接進入使用FirstOrDefault

public ExpenseItem ToFind(string trip) 
{ 
    return this.FirstOrDefault(e => e.Trip == trip); 
} 

我相信this是定製的集合如果你真的否則LINQ的擴展不會在this

編輯

工作想要這個..

public IEnumerable<ExpenseItem> ToFind(string trip) 
{ 
    return this.Where(e => e.Trip == trip); 
} 

然後你將需要處理來自呼叫者的列表。

private void tripSelect_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    IEnumerable<ExpenseItem> selectedExpenses = roster.ToFind((string)tripSelect.SelectedItem); 
    foreach(ExpenseItem item in selectedExpenses) 
     listExpenses.Items.Add(item); 
} 
+0

感謝。儘管(由於FirstOrDefault()),它仍然只檢索第一個值。 因爲,就像你說的,我無法從IEnumerable中投射。 – user1350264 2012-04-23 05:08:26

+0

所以你想達到什麼目的。使用它的代碼試圖將其轉換爲'ExpenseItem',所以我認爲它需要一個值。返回列表有什麼目的,除非你想要多個匹配。 – aqwert 2012-04-23 05:09:57

+0

我確實想要多個值。該表單允許我選擇行程類型,然後顯示所有關聯的行項目並對其進行編輯。 – user1350264 2012-04-23 05:11:39

0

如果你會使用這個:

public IEnumerable<ExpenseItem> ToFind(string trip) 
{ 
    return this.Where(e => e.Trip == trip); 
} 

您需要使用此功能,請注意FirstOrDefault:

selectedExpense = roster 
     .ToFind((string)tripSelect.SelectedItem) 
     .FirstOrDefault(); 

你selectedExpense不是一個IEnumerable:

private ExpenseItem selectedExpense; 

通過良好的設計,如果查找器完全匹配一條記錄,例如按主鍵

public ExpenseItem ToFind(string expenseId) 
{ 
    return this.FirstOrDefault(e => e.ExpenseId == expenseId); 
} 

,使用FirstOrDefault,然後,你可以把它簡單地使用finder方法是這樣的:

selectedExpense = roster.ToFind(idHere);