0

这里有三个要素。

  1. 带有一堆方法的旅行费用清单
  2. Windows 窗体(tripChoose 是一个组合框,listExpenses 是一个列表框)
  3. 对象本身(旅行费用)

我只想将 e.Trip 传递给“ToFind”方法。相反,整个字符串被传递。我只需要以某种方式解析出 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.Triproster.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.Trip,而不是 e.SumAmount。

现在,假设我写的是你要求的东西,你可以做一些简单的事情......

首先,请确保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 回答