Обновить ячейку в DataGridView, чтобы создать новую строку

#c# #for-loop

#c# #для цикла

Вопрос:

У меня есть две таблицы DataGridView. Один содержит все доступные продукты и количество MO_CatData
введите описание изображения здесь

Второй — это элементы, которые вы добавляете в таблицу. MO_quantityData
введите описание изображения здесь

Теперь, если я выберу выбранную строку MO_CatData и щелкну Add to Order по ней, она должна пройти цикл MO_quantityData . Если идентификатор продукта уже находится внутри таблицы, мы просто обновляем количество; Иначе мы создаем новую строку.

Итак, чтобы получить идентификатор продукта в MO_CatData я использовал:

 int id = Convert.ToInt32(MO_CatData.SelectedRows[0].Cells[0].Value);
 

Затем я хочу использовать for цикл и проверить, существует ли он; если он существует, он обновится, иначе будет создана новая строка:

 else
{
    int id = Convert.ToInt32(MO_CatData.SelectedRows[0].Cells[0].Value);
    for (int i = 0; i < MO_quantityData.Rows.Count; i  )
    {
        Debug.WriteLine(id);

        if (Convert.ToInt32(MO_quantityData.Rows[i].Cells[2].Value) == id)
        {
            Debug.WriteLine("Gets to if");
            qty = Convert.ToInt32(MO_quantity.Text);
            int newQty = Convert.ToInt32(MO_quantityData.Rows[i].Cells[3].Value)   qty;
            table.Rows[i][3] = newQty;

            float totalprice = newQty * price;
            totalPrice = totalprice;
            sum  = totalPrice;

            table.Rows[i][5] = totalPrice;
            MO_quantityData.DataSource = table;
            MO_CatData.Refresh();
        }
        else
        {
            Debug.WriteLine("ELESLESLELES");
            num = num   1;

            qty = Convert.ToInt32(MO_quantity.Text);

            float totalprice = qty * price;
            totalPrice = totalprice;

            table.Rows.Add(num, product, prodID, qty, price, totalprice);
            MO_quantityData.DataSource = table;
            MO_CatData.Refresh();

            flag = 0;
            sum  = totalPrice;
        }
    }
}
 

Я чувствую, что моя логика где-то неверна, потому что, если я попытаюсь добавить 2 пиццы, затем 1 курицу, а затем еще одну пиццу, я получу:

введите описание изображения здесь

Является ли неправильным использование оператора for в этом сценарии? Я думал, что это будет так же просто, как перебирать таблицу, если приращение цикла в ячейке 2 равно selectedRow, тогда количество обновлений еще создаст новую строку, но явно нет.

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

1. Вам нужно выйти из цикла for, если вы найдете идентификатор, иначе он снова добавит пиццу.

Ответ №1:

Если вы немного разбили код, вы, вероятно, увидите, что пошло не так: вам нужно остановить поиск, когда вы найдете нужный продукт. Я добавил FindRowWithId функцию, которая позаботится о ее поиске, а остальное останется как есть. Вероятно, вам также будет выгодно иметь только расчеты цен и так далее в одном месте.

 private int FindRowWithId(int id)
{
    for (int i = 0; i < MO_quantityData.Rows.Count; i  )
    {
        if (Convert.ToInt32(MO_quantityData.Rows[i].Cells[2].Value) == id)
        {
            return i;
        }
    }
    return -1; // Not found;
}

...
else
{
    int id = Convert.ToInt32(MO_CatData.SelectedRows[0].Cells[0].Value);
    int foundRow = FindRowWithId(id);
    if (foundRow > -1)
    {
        Debug.WriteLine("Gets to if");
        qty = Convert.ToInt32(MO_quantity.Text);
        int newQty = Convert.ToInt32(MO_quantityData.Rows[foundRow].Cells[3].Value)   qty;
        table.Rows[foundRow][3] = newQty;
        float totalprice = newQty * price;
        totalPrice = totalprice;
        sum  = totalPrice;

        table.Rows[foundRow][5] = totalPrice;
        MO_quantityData.DataSource = table;
        MO_CatData.Refresh();
    }
    else
    {
        Debug.WriteLine("ELESLESLELES");
        num = num   1;

        qty = Convert.ToInt32(MO_quantity.Text);

        float totalprice = qty * price;
        totalPrice = totalprice;

        table.Rows.Add(num, product, prodID, qty, price, totalprice);
        MO_quantityData.DataSource = table;
        MO_CatData.Refresh();

        flag = 0;
        sum  = totalPrice;
    }
}