2013-09-25 3 views
0

Я уже могу редактировать данные в базе данных. Но у меня возникла проблема, когда я редактирую и обновляю столбец Quantity в datagridview, он должен обновить столбец Total в datagridview на основе Quantity * SubTotal, но это обновление только колонки Quantity, а не цены.Редактировать в datagridview успешно, но он не обновляет определенный столбец

Где я сделал ошибку?

Вот скриншот:

enter image description here

Как вы можете видеть в рядах «1», то Quantity 100 и SubTotal составляет 10000, поэтому Total будет 1000000. Но в строках «2», то Quantity, прежде чем я редактировать в DataGridView, то количество является 100, а также Total является 2000000, когда я изменить Quantity к 500, то Total еще 2000000, предполагаемый Total быть 10000000.

Где я сделал ошибку?

Вот код (я выкладываю код по мере необходимости, в случае необходимости):

private void Updated(object sender, EventArgs e) 
     { 
      DataTable _dt = (DataTable)dataGridView1.DataSource; 

      if (_dt.DefaultView.Count > 0) 
      { 
       int rowNum = dataGridView1.CurrentRow.Index; 
       string productCode = Convert.ToString(_dt.DefaultView[rowNum]["ProductCode"]); 
       int quantity = Convert.ToInt32(_dt.DefaultView[rowNum]["Quantity"]); 
       int price = Convert.ToInt32(_dt.DefaultView[rowNum]["SubTotal"]); 
       int _price = Convert.ToInt32(_dt.DefaultView[rowNum]["Total"]); 

       using (OleDbConnection conn = new OleDbConnection(connectionString)) 
       { 
        string _commandSelect = "SELECT [Quantity], [SubTotal], [Total] FROM [TransRecord] WHERE [ProductCode] = @ProductCode"; 
        string commandUpdate = "UPDATE [Record] SET [Quantity] = @Quantity, [SubTotal] = @SubTotal, [Total] = @Total WHERE [ProductCode] = @ProductCode"; 
        string _commandUpdate = "UPDATE [TransRecord] SET [Quantity] = @Quantity, [SubTotal] = @SubTotal, [Total] = @Total WHERE [ProductCode] = @ProductCode"; 

        conn.Open(); 

        using (OleDbCommand cmdUpdate = new OleDbCommand(_commandUpdate, conn)) 
        using (OleDbCommand _cmdSelect = new OleDbCommand(_commandSelect, conn)) 
        using (OleDbCommand _cmdUpdate = new OleDbCommand(commandUpdate, conn)) 
        { 
         _cmdSelect.Parameters.Add("@ProductCode", System.Data.OleDb.OleDbType.VarChar); 
         _cmdSelect.Parameters["@ProductCode"].Value = productCode; 

         cmdUpdate.Parameters.Add("@Quantity", System.Data.OleDb.OleDbType.Integer); 

         _cmdUpdate.Parameters.Add("@Quantity", System.Data.OleDb.OleDbType.Integer); 

         cmdUpdate.Parameters.Add("@SubTotal", System.Data.OleDb.OleDbType.Integer); 

         _cmdUpdate.Parameters.Add("@SubTotal", System.Data.OleDb.OleDbType.Integer); 

         cmdUpdate.Parameters.Add("@Total", System.Data.OleDb.OleDbType.Integer); 

         _cmdUpdate.Parameters.Add("@Total", System.Data.OleDb.OleDbType.Integer); 

         using (OleDbDataReader dReader = _cmdSelect.ExecuteReader()) 
         { 
          while (dReader.Read()) 
          { 
           cmdUpdate.Parameters.Add("@ProductCode", System.Data.OleDb.OleDbType.VarChar); 
           _cmdUpdate.Parameters.Add("@ProductCode", System.Data.OleDb.OleDbType.VarChar); 

           cmdUpdate.Parameters["@ProductCode"].Value = productCode; 
           cmdUpdate.Parameters["@Quantity"].Value = quantity; 
           cmdUpdate.Parameters["@SubTotal"].Value = price; 
           cmdUpdate.Parameters["@Total"].Value = _price; 

           _cmdUpdate.Parameters["@ProductCode"].Value = productCode; 
           _cmdUpdate.Parameters["@Quantity"].Value = quantity; 
           _cmdUpdate.Parameters["@SubTotal"].Value = price; 
           _cmdUpdate.Parameters["@Total"].Value = _price; 

           int numberOfRows = _cmdUpdate.ExecuteNonQuery(); 
           int _numberOfRows = cmdUpdate.ExecuteNonQuery(); 
          } 

          dReader.Close(); 
         } 
        } 

        conn.Close(); 
       } 
     } 

private void UpdatePrice(object sender, EventArgs e) 
     { 
      if (numericTextBox1.TextLength >= 6) 
      { 
       decimal quantity = Convert.ToInt32(this.numericUpDown1.Value); 
       decimal price = Convert.ToDecimal(this.numericTextBox2.Text); 
       int total = Convert.ToInt32(quantity * price); 

       if (numericUpDown1.Value > 0) 
       { 
        this.numericTextBox3.Text = total.ToString(); 
       } 
      } 
     } 

Total работает, когда он не в DataGridView, то здесь (показан скриншот):

enter image description here

Но когда он идет к DataGridView и, когда я изменить Quantity, не обновлять Total на основе SubTotal * Quantity

Я ценю вашу помощь и ответ!

Большое спасибо!

+0

Ваш datagridview привязан к вашим данным. Убедитесь, что сетка снова связана с обновленными данными? – Danexxtone

+0

Я не так уверен, мистер Danexxtone. Я новичок в этом вопросе, хотя – Kaoru

ответ

0

Чтобы обновить сетку с правильным результатом, вам нужно сделать две вещи: первая - обновить Total в наборе данных. Во-вторых, необходимо перенастроить сетку на обновленный набор данных. Наиболее распространенный способ сделать это - установить источник данных null, а затем вернуться к вашему набору данных. Я также предложил бы посмотреть ваши инструкции sql, в частности cmdSelect. Он никогда не использовался.
Редактировать:
Взгляните на EditMode и на мероприятие CellEndEdit. Должно быть хорошим началом начать редактирование сетки. EditMode указывает, когда редактировать ячейку, и событие cellEndEdit может использоваться для обновления данных в вашей сетке.

+0

ах, да, вы правы, мистер Danexxtone, я просто снова просмотрю код, и я только что понял, мне просто нужно одно заявление SELECT для выполнения двух инструкций UPDATE. Спасибо Danexxtone, я обновлю код выше. – Kaoru

+0

Вы можете обновить сетку с ответом здесь: http://stackoverflow.com/a/7009131/571881 – Danexxtone

+0

Сэр, ссылка, которую вы мне дали, предназначена для обновления datagridview? Я хочу, когда я редактирую данные через datagridview, он не обновляется, как в текстовом поле (перед отправкой в ​​datagridview) – Kaoru

Смежные вопросы