2012-04-23 3 views
2

클래스가 ExpenseItem이고 해당 클래스를 기반으로 한 목록이 있습니다.쿼리 결과를 목록 상자에 반환하십시오.

현재 ExpenseItem 여행의 특정 유형을 선택하고 모든 결과를 목록 상자에 표시 할 수있는 콤보 상자가있는 양식을 디자인하고 있습니다.

양식 코드 (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 절을 건너 뛰고 바로 내가 this 가정 FirstOrDefault

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

을 사용에 갈 것 정말 당신이 경우 그렇지 않으면의 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

+0

그래서 무엇을 성취하려고합니다. 그것을 사용하는 코드는 그것을 'ExpenseItem'에 던지려고하므로 단일 값을 원한다고 가정합니다. 여러 경기를 원한다면 목록을 반환하는 목적은 무엇입니까? – aqwert

+0

여러 값을 원합니다. 이 양식을 사용하면 여행 유형을 선택한 다음 모든 관련 광고 항목을 표시하고 편집 할 수 있습니다. – user1350264

0

이를 사용할 경우 :

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

귀하의 selectedExpense는 IEnumerable을하지 않습니다 :

private ExpenseItem selectedExpense; 

당신은이를 사용할 필요가
public IEnumerable<ExpenseItem> ToFind(string trip) 
{ 
    return this.Where(e => e.Trip == trip); 
} 

는 FirstOrDefault주의


좋은 디자인으로, 파인더가 정확히 하나의 레코드 만 일치하면, 예를 들어.

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

기본 키

에 의해, FirstOrDefault를 사용하고, 당신은 단순히 같은 파인더 방법을 사용할 수 있습니다

selectedExpense = roster.ToFind(idHere); 
관련 문제