2017-02-22 44 views
2

Приращение количество на единицу (+1), если идентификатор является продукт существует в текущем DataGridViewПриращение количество на единицу (+1), если идентификатор является продукт существует в текущем DataGridView

Мой DataGridView имеет 9 столбцов:

Column 1 = Edit_Checkbox   Column 2 = ItemCount 

Column 3 = DGV_PRODUCT_ID   Column 4 = DGV_PRODUCT_DESC 

Column 5 = DGV_UNIT_PRICE   Column 6 = DGV_QUANTITY 

Column 7 = DGV_DISCOUNT    Column 8 = DGV_TOTAL_PRICE 

Column 9 = DGV_NOTES 

Я пытаюсь увеличиваем количество на единицу (+1), если идентификатор продукта существует в текущем DataGridView

Мой код ниже работает нормально, но у меня есть вопрос, который, когда существует же идентификатор продукта будет увеличиваем Количество на единицу, если процесс выполняется, но если я ввел идентификатор продукта не последовательным образом, он не будет увеличивать количество на единицу, а вместо этого добавит новую строку в datagridview.

Например:

Введите продукт идентификационный номер 1003 Количество 2 шт будет 2

Введите ID номер продукта 3000 Количество 1 шт будет 1

Введите номер продукта ID 1003 1 шт количество будет по-прежнему равно 1, когда продукт уже существует в datagridview. Как мне избежать этого?

private void SelectedProductData() 
     { 
      int ItemCount = DGV_INVOICE.Rows.Count; 
      bool ProductIDExist = false; 

      string connstr = @"Data Source=orcl; User Id=user; password=pwd;"; 
      string cmdtxt = @"SELECT PRODUCT_ID, 
            PRODUCT_DESC, 
            UNIT_PRICE 
           FROM WAREHOUSE 
           WHERE PRODUCT_ID = :P_Product_ID"; 

      try 
      { 
       using (OracleConnection conn = new OracleConnection(connstr)) 
       using (OracleCommand cmd = new OracleCommand(cmdtxt, conn)) 
       { 
        conn.Open(); 

        cmd.CommandType = CommandType.Text; 
        cmd.CommandText = cmdtxt; 

        cmd.Parameters.Add(new OracleParameter(":P_Product_ID", OracleDbType.Varchar2)).Value = TB_Product_ID.Text; 

        OracleDataReader oraReader = cmd.ExecuteReader(); 

        while (oraReader.Read()) 
        { 
         ItemCount++; 
         RowCountLabel.Text = ItemCount.ToString(); 

         DataGridViewRow dgvRow = new DataGridViewRow(); 

         foreach (DataGridViewRow ItemRow in DGV_INVOICE.Rows) 
         { 
          if (Convert.ToString(ItemRow.Cells[2].Value) == TB_Product_ID.Text) 
          { 
           MessageBox.Show(Convert.ToString(ItemRow.Cells[2].Value) + " 1 " + TB_Product_ID.Text); 
           ProductIDExist = true; 
           break; 
          } 
         } 
         if (ProductIDExist) 
         { 
          MessageBox.Show("2"); 
          //dgvRow.Cells[5].Value = Convert.ToString(1 + Convert.ToInt64(dgvRow.Cells[5].Value)); 
          DGV_INVOICE.Rows[dgvRow.Index].Cells[5].Value = Convert.ToString(1 + Convert.ToInt64(dgvRow.Cells[5].Value)); 
         } 
         else 
         { 
          MessageBox.Show("3"); 

          //Add the row to grid view for the first time 
          dgvRow.Cells.Add(new DataGridViewCheckBoxCell()); //Edit_Checkbox  index 0 
          dgvRow.Cells[0].Value = false; 

          dgvRow.Cells.Add(new DataGridViewTextBoxCell()); //ItemCount   index 1 
          dgvRow.Cells[1].Value = ItemCount; 

          dgvRow.Cells.Add(new DataGridViewTextBoxCell()); //DGV_PRODUCT_ID index 2 
          dgvRow.Cells[2].Value = oraReader.GetValue(0); 

          dgvRow.Cells.Add(new DataGridViewTextBoxCell()); //DGV_PRODUCT_DESC index 3 
          dgvRow.Cells[3].Value = oraReader.GetString(1); 

          dgvRow.Cells.Add(new DataGridViewTextBoxCell()); //DGV_UNIT_PRICE index 4 
          dgvRow.Cells[4].Value = oraReader.GetValue(2); 

          dgvRow.Cells.Add(new DataGridViewTextBoxCell()); //DGV_QUANTITY  index 5 
          dgvRow.Cells[5].Value = "1"; 

          dgvRow.Cells.Add(new DataGridViewTextBoxCell()); //DGV_DISCOUNT  index 6 
          dgvRow.Cells[6].Value = "0"; 

          //dgvRow.Cells.Add(new DataGridViewTextBoxCell()); //DGV_TOTAL_PRICE index 7 
          //dgvRow.Cells[7].Value = "0"; 

          //dgvRow.Cells.Add(new DataGridViewTextBoxCell()); //DGV_NOTES   index 8 
          //dgvRow.Cells[8].Value = "-"; 

          DGV_INVOICE.Rows.Add(dgvRow); 
          dgvRow.Selected = true; 
         } 
        } 
       } 
      } 
      catch (Exception EX) 
      { 
       MessageBox.Show(EX.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); 
       TB_ORDER_NOTE.Text = EX.Message;   /* Testing Purpose */ 
      } 
     } 
+0

Вы говорите, что ваша сетка имеет 4 колонки, но вы ссылаетесь на 6-й столбец с линией 'DGV_INVOICE.Rows [ItemRow.Index] .Cells [5] .Value =. .. 'как будто его шестой, а не третий, столбец, который содержит количество. Почему это? Также (в предположении 4 столбца) в операторе 'if' не будет' ItemRow.Cells [2] 'ссылаться на количество, а не на цену? Почему бы не проверить по id, а не по цене? – theKunz

+0

@ theKunz его просто пример, чтобы объяснить мой случай – sam

+0

Можем ли мы увидеть фактический код, который вы используете? – theKunz

ответ

0

Вместо этого попробуйте

bool ProductIDExist = false; 
foreach (DataGridViewRow ItemRow in DGV_INVOICE.Rows) 
{ 
    //Check if the product Id exists with the same Price 
    ProductIDExist |= Convert.ToString(ItemRow.Cells[1].Value) == TB_Product_ID.Text 

    if (productIDExist) 
    { 
     break; 
    } 
} 

if (productIDExist) 
{ 
    //increase quantity by 1 
} 
else 
{ 
    //add a new row 
} 
+0

Сообщение об ошибке 'Index был за пределами допустимого диапазона. Должен быть неотрицательным и меньше размера коллекции. Имя параметра: index' на 'messagebox.show (" 4 "); 'Я отправлю код, измененный в соответствии с вашим предложением – sam