2012-04-26 5 views
0

ここには3つの要素があります。リストからコンボボックスにレコードを渡し、その一部をパースしてメソッドに値を返します

  1. 方法
  2. の束Windowsフォーム(tripChooseコンボボックスとlistExpenses、リストボックスである)
  3. オブジェクト自体(旅費)
と旅行費用のリスト

私は "ToFind"メソッドにeTripだけを渡したいと思います。代わりに、文字列全体が渡されます。私はeだけを解析する必要があります。何か案は?私はまだコンボボックスに表示する量と旅行の両方が欲しいですが、私はメソッドに渡すためにe.Tripだけ必要です。以下を参照してください:

形で、私はこの

private void LoadExpenseListSums() 
{ 
    expenseTotalSelect.Items.Clear(); 
    var dateSorted = 
     from e in roster 
     group e by e.Trip into tripGroup 
     select new { Trip = tripGroup.Key, SumAmount = tripGroup.Sum(e => e.Amount) }; 
    foreach (var e in dateSorted) 
     tripChoose.Items.Add(string.Format("{0} | ${1}", e.Trip, e.SumAmount)); 
} 

private void tripChoose_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    listExpenses.Items.Clear(); 
    tripTextBox.Clear(); 
    descriptionTextBox.Clear(); 
    amountTextBox.Clear(); 
    paymentMethodTextBox.Clear(); 
    noteTextBox.Clear(); 
    IEnumerable<TripExpense> selectedExpenses = roster.ToFind((string)tripChoose.SelectedItem); 
    foreach (TripExpense item in selectedExpenses) 
     listExpenses.Items.Add(item);    
} 

LoaExpenseListSumsを持つフォームがロードされたときに起こる、私はe.Tripこの方法

に渡される roster.ToFind((string)tripChoose.SelectedItem);で一部だけになりたいですLoadExpenseListSumsのような書き換えられた場合
 public IEnumerable<TripExpense> ToFind(string trip) 
    { 
     return this.Where(e => e.Trip == trip); 
    } 

それは正常に動作します:

 private void LoadExpenseListSums() 
     { 
      expenseTotalSelect.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) 
       tripChoose.Items.Add(e.Trip); 
     } 
+0

を書くことができ、あなたはどこかに疑問を持っているのですか?あなたは 'に基づいて分割することはできません|'と値を取得しますか? Payroll.ExpenseRecorderForm + tempTrip 私はちょうどdispTextクラスのプロパティ作る – V4Vendetta

答えて

1

お役に立てば幸いです。

一時クラスを宣言します。

public class tempTrip 
    { 
     public string Trip; 
     public string dispText { get; set;} 
    } 

今(LoadExpenseListSumsを変更)機能

private void LoadExpenseListSums() 
{  expenseTotalSelect.Items.Clear();  
     var dateSorted =   
        from e in roster   
        group e by e.Trip into tripGroup   
         select new tempTrip 
         { Trip = tripGroup.Key, dispText = string.Format("{0} | ${1}", tripGroup.Key, tripGroup.Sum(e => e.Amount)).Tostring() };  

      tripChoose.DisplayMember = "dispText"; 
      tripChoose.DataSource = dateSorted.ToList<tempTrip>();  
} 

は今tripChoose_SelectedIndexChangedに、あなたは私が失われています

IEnumerable<TripExpense> selectedExpenses = roster.ToFind(((tempTrip)tripChoose.SelectedItem).Trip); 
// this will give you Trip from the selected item. 
+0

おかげで、私は、これはプルダウンリストを選択する私の旅に表示取得しています。それが動作します。変更されたコードを参照してください。 – user1350264

+0

を表示するには、そのフォーマットされた文字列を取得する必要があります: – userGS

1

あなたがToFindことを実現するとき、あなたはそれが唯一のe.Tripを取ることwanto、

roster.ToFind((string)tripChoose.SelectedItem); 

しかし:私はあなたがこれをやっている参照してください。

foreach (var e in dateSorted) 
    tripChoose.Items.Add(string.Format("{0} | ${1}", e.Trip, e.SumAmount)); 

そして、あなたはこれを実現したいです、e.SumAmountではありません。今

、あなたは物事をシンプルに行うことができ、私が書いてきたことは、あなたが求めているものとすると...

まず、あなたがここにそれを持っているようstring.Format("{0} | ${1}", e.Trip, e.SumAmount)が書かれていることSHUREを作ります。次に、不要な部分を削除することができますtripChoose.SelectedItem |書式設定の文字。考え方としては、次のようにaを使用できます。

string myItem = (string)tripChoose.SelectedItem; 
int removingIndex; 
for (int i = 0; i < myItem.Length; i++) 
{ 
    if (myItem[i] == '|') 
    { 
     removingIndex = i; 
     i = myItem.Length; 
    } 
} 
myItem.Remove(removingIndex); 

これは最善の方法ですか...?いいえ、それは基本的な考えです。

これで、文字列にeTrip部分のみを含むroster.ToFindを使用できます。

はそれが私はそれを行うには少し異なるアプローチを取るのが好きwoul

関連する問題