将查询结果返回给列表框
问题描述:
我有一个类,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;
}
答
我不能编写像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);
}
答
如果你会使用这个:
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);
感谢。尽管(由于FirstOrDefault()),它仍然只检索第一个值。 因为,就像你说的,我无法从IEnumerable中投射。 – user1350264 2012-04-23 05:08:26
所以你想达到什么目的。使用它的代码试图将其转换为'ExpenseItem',所以我认为它需要一个值。返回列表有什么目的,除非你想要多个匹配。 – aqwert 2012-04-23 05:09:57
我确实想要多个值。该表单允许我选择行程类型,然后显示所有关联的行项目并对其进行编辑。 – user1350264 2012-04-23 05:11:39