2012-04-23 60 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);