Nox Eternal
Nox Eternal

Reputation: 15

Display the sum of all items inside listbox

Is it possible to sum up all of the item's price inside a ListBox? I have this ListBox that displays items from a DataGridView, and each of their prices are in priceTextBox Please refer from the picture below.

enter image description here

What I want to do is to display the sum of all the item's price and display it at the totalTextBox.

I have already done this code but I think this won't work.

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

Will appreciate any help! Thanks!

Upvotes: 0

Views: 720

Answers (2)

Blake Thingstad
Blake Thingstad

Reputation: 1659

Try this out...

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

Upvotes: 1

Elo
Elo

Reputation: 2352

I think you should change your approach, by separating completely data and display. To do that, you could create a class which will contain data for each row of your DataGrid :

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

And then in your codebehind, you store a list of these items :

private List<MyItem> AllItems = new List<MyItem>();  

Finally, you set this collection as the source of your DataGrid :

menuDataGrid.DataSource = AllItems;

Then, all your data is stored in a collection you own, and to sum prices it's much simpler :

using System.Linq;

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

The next step is to use Binding and a BindingList, wich allows the DataGrid to refresh automatically when new items are added in "AllItems": see this well explained post.

Upvotes: 0

Related Questions