2017-11-20 22 views
0

リストボックス内のアイテムの価格をすべて集計することは可能ですか? DataGridViewのアイテムを表示するListBoxがあり、その価格はそれぞれpriceTextBox以下の図を参照してください。私が何をしたいかリストボックス内のすべてのアイテムの合計を表示する

enter image description here

すべてのアイテムの価格の合計を表示し、totalTextBoxでそれを表示することです。

私はすでにこのコードを行っていますが、これはうまくいかないと思います。

private void menuListBox_SelectedValueChanged(object sender, EventArgs e) 
    { 
     int x = 0; 
     string Str; 

     foreach (DataGridViewRow row in menuDataGrid.Rows) //this part displays the price of each item to a textbox so this is good. 
     {   
      if (row.Cells[3].Value.ToString().Equals(menuListBox.SelectedItem.ToString())) 
      {     
       pricetxtbox.Text = row.Cells[5].Value.ToString();          
       break; 
      } 
     } 

     foreach (string Str in row.Cells[5].Value.ToString().Equals(menuListBox.SelectedItem.ToString())) //now this is the part where I want to happen the adding the prices of all items in the listbox. this also gives me an error at row saying it doesn't exist in the context 
     { 
      x = x + Convert.ToInt32(Str); 
      totaltxtbox.Text = x; 
     } 
    } 

助けていただきありがとうございます。ありがとう!

+0

これを試してみてください。 'break'も必要ない(または望みます)。 – McGuireV10

+0

私は少し明確化が必要です。 ListBoxで選択した項目のDataGridViewを検索してその価格を表示していますか?その場合、ListBox内の項目のDataGridViewに複数の一致する項目がありますか? ListBox内の選択された項目にかかわらず、合計はすべての価格の合計であると考えられますか? –

+0

@BlakeThingstad ListBoxのアイテムは、DataGridViewからのものです。アイテムをListBoxにドラッグすると、アイテムの「MenuCode」が追加されます。 ListBox内で項目を選択すると、 'MenuPrice 'が最初のTextBoxで表示されます。今私が起こそうとしているのは、ListBoxに2つのアイテムがある場合、たとえば価格が100と50の場合、2つの合計が加算されて2番目のTextBoxに表示されます。投稿を編集し、項目を取得するDataGridViewを追加します。 –

答えて

1

は `row`オブジェクトのみ最初` foreach`ループ内に存在するので、 `最初の内部foreach`秒を移動...

Func<string, DataGridViewRow> getRow = (menuCode) => 
{ 
    return menuDataGrid.Rows.Cast<DataGridViewRow>() 
     .First(r => ((string)r.Cells[3].Value).Equals(menuCode)); 
}; 

var selected = menuListBox.SelectedItem.ToString(); 
pricetxtbox.Text = getRow(selected).Cells[5].Value.ToString(); 

totaltxtbox.Text = menuListBox.Items.Cast<object>() 
    .Select(o => o.ToString()) 
    .Select(i => (int)getRow(i).Cells[5].Value) 
    .Sum() 
    .ToString(); 
+0

これは絶対に私が探していたものです。そしてそれはトリックをした...ありがとう!答えとしてマーク。 –

0

データを完全に分離して表示することで、アプローチを変更する必要があると思います。 はあなたのDataGridの行ごとにデータが含まれていますクラスを作成することができ、それを行うには:

public class MyItem 
{ 
    public string Caption { get; set; } 
    public int Price { get; set; } 
} 

そして、あなたの分離コードでは、あなたは、これらの項目のリストを格納します。

最後に
private List<MyItem> AllItems = new List<MyItem>(); 

、あなたはあなたのデータグリッドのソースとしてこのコレクションを設定します。

menuDataGrid.DataSource = AllItems; 

その後、すべてのデータは、あなたが自身のコレクションに格納されており、それははるかに簡単だ価格を合計します: this well explained post参照:

using System.Linq; 

private int ComputeSum() 
{ 
    return (AllItems.Sum(item => item.Price)); 
} 

次のステップは​​結合および使用することで、WICHは、新しい項目が「AllItems」に追加されたときにデータグリッドを自動的に更新することを可能にします。

+0

こんにちは@Ello。私はこれを考慮して試してみる。ありがとうございました! –