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