0

ここには 3 つの要素があります。

  1. たくさんのメソッドを含む旅費のリスト
  2. Windows フォーム (tripChoose はコンボ ボックス、listExpenses はリスト ボックス)
  3. 物自体(旅費)

「ToFind」メソッドに e.Trip だけを渡したい。代わりに、文字列全体が渡されます。どうにかして e.Trip だけを解析する必要があります。何か案は?金額とトリップの両方をコンボ ボックスに表示したいのですが、メソッドに渡す必要があるのは 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);をこのメソッドに渡す必要があります。

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

LoadExpenseListSums を次のように書き直せば問題なく動作します。

        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);
        }
4

2 に答える 2

1

私はあなたがこれをしているのを見ます:

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

そして、あなたはこれを達成したいと思います:

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

ただし、ToFindを実行する場合は、e.SumAmountではなくe.Tripのみを使用する必要があります。

さて、私が書いたものがあなたが求めているものであると仮定すると、あなたは簡単なことをすることができます...

まず、ここにあるとおりにstring.Format("{0} | ${1}", e.Trip, e.SumAmount)書かれていることを確認します。tripChoose.SelectedItem次に、|に基づいての不要な部分を削除できます。フォーマットの文字。アイデアとして、次のようなforを使用できます。

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);

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

これで、e.Trip部分のみを持つ文字列でroster.ToFind使用できます。myItem

それが役に立てば幸い

于 2012-04-26T05:19:35.607 に答える
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.
于 2012-04-26T05:54:55.463 に答える