Как умножать ячейки в строке, gridview

#c#

#c#

Вопрос:

Когда я нажимаю кнопку, я хочу умножить ячейки в строке, а затем вывести результат в другую ячейку, но делаю это индивидуально для каждой строки, код, который у меня есть прямо сейчас

 foreach (DataGridViewRow Column in dataGridView1.Rows)
                {
                    for (int i = 0; i < dataGridView1.Rows.Count;   i)
                    {
                        if (dataGridView1.Rows[i].Cells[2].Value == null)
                        {
                            Column.Cells[dataGridView1.Columns["FinalPrice"].Index].Value = (Convert.ToDouble(Column.Cells[dataGridView1.Columns["Price"].Index].Value) * Convert.ToDouble(Column.Cells[dataGridView1.Columns["Amount"].Index].Value));
                        }
                        else
                        {
                            Column.Cells[dataGridView1.Columns["FinalPrice"].Index].Value = (Convert.ToDouble(Column.Cells[dataGridView1.Columns["Price"].Index].Value) * Convert.ToDouble(Column.Cells[dataGridView1.Columns["Discount"].Index].Value)) * Convert.ToDouble(Column.Cells[dataGridView1.Columns["Amount"].Index].Value);
                        }

                    }

                }
  

Проблема в том, что если в одной ячейке отображается значение null в любой строке, то выполняется этот код для всех строк

 Column.Cells[dataGridView1.Columns["FinalPrice"].Index].Value = (Convert.ToDouble(Column.Cells[dataGridView1.Columns["Price"].Index].Value) * Convert.ToDouble(Column.Cells[dataGridView1.Columns["Amount"].Index].Value));
  

Для каждой строки я хочу проверить, равна ли ячейка скидки нулю, и если да, то умножьте ячейку суммы и цены или, если это не так, умножьте сумму, цену и ячейку скидки

Комментарии:

1. В чем вопрос? я не понял, что вы хотите сделать и в чем ваша проблема?

Ответ №1:

Не прямой ответ, а альтернативный подход, который должен устранить эту и подобные проблемы.
Альтернативным подходом было бы извлечь логику пользовательского интерфейса из фактического вычисления

Создайте класс для представления данных в строке

 public class Purchase
{
    public string Item { get; set; }
    public int Amount { get; set; }
    public decimal Price { get; set; }
    public decimal? Discount { get; set; }

    public decimal FinalPrice = Price * Amount * Discount.GetValueOrDefault(1.0m);
}
  

Для отображения покупок в DataGridView вам нужна только одна строка кода

 var purchases = LoadPurchasesFromDatabase();

dataGridView.DataSource = purchases;
  

Изменения значений в экземпляре Purchase класса автоматически обновят DataGridView.

Если вам нужно поддерживать добавление и удаление покупок из коллекции, тогда вам нужно сделать так, чтобы коллекция покупок была типа BindingList<Purchase>

Извлекая логику покупки из нашего кода пользовательского интерфейса, вы избавляетесь от утомительного и избыточного преобразования, зацикливания столбцов и строк datagridview.