Actualizar celda si uno de los campos es igual al agregar filas desde un TextBox

publicado por: Anonymous

Tengo dos DataGridView las siguientes columnas:

  • CODIGO
  • NOMBRE
  • CANTIDAD.

A través de TextBox y un botón, estoy pasando valores de un DataGridView a otro, agregando nuevas filas.

¿Es posible lograr que al encontrar valores idénticos en CODIGO y NOMBRE, aumente la CANTIDAD, actualizando esa fila, sin crear una nueva?

Este es mi código:

Dim newRow As DataRowView = DirectCast(Pedidos_GeneralBindingSource.AddNew(), DataRowView)

newRow("CODIGO") = CODIGOTextBox.Text
newRow("NOMBRE") = NOMBRETextBox.Text
newRow("CANTIDAD") = CANTIDADTextBox.Text

EDITADO

Este es el código que tengo hasta ahora:

Dim DT_Segundo As New DataTable
DT_Segundo.Columns.Add("CODIGO", Type.[GetType]("System.String"))
DT_Segundo.Columns.Add("NOMBRE", Type.[GetType]("System.String"))
DT_Segundo.Columns.Add("CANTIDAD", Type.[GetType]("System.String"))

Dim primarykey(1) As DataColumn
primarykey(0) = DT_Segundo.Columns("CODIGO")
DT_Segundo.PrimaryKey = primarykey

DataGridView2.DataSource = DT_Segundo

Dim CODIGOi As String
Dim NOMBREi As String
Dim CANTIDADi As String

CODIGOi = CODIGOTextBox.Text
NOMBREi = NOMBRETextBox.Text
CANTIDADi = CANTIDADTextBox.Text

If Not DT_Segundo.Rows.Find(CODIGOi) Is Nothing Then
    DT_Segundo.Rows.Find(CODIGOi).Item("CANTIDAD") = DT_Segundo.Rows.Find(CODIGOi).Item("CANTIDAD") + CANTIDADi
Else
    DT_Segundo.Rows.Add(CODIGOi, NOMBREi, CANTIDADi)
End If

Mi problema está ahora en que al ejecutarlo, reemplazo los valores existentes de mi DataGridView2 por una fila creada a partir de los valores alojados en los TextBox. No agrega nuevas filas ni suma la cantidad para aquellas que tienen mismo valor en la columna “CODIGO”.


EDITADO 2

Agregue la columna COSTO para calcular valor y finalmente pude lograrlo con otro código, lo dejo para aquel que le pueda servir:

    Dim Found As Boolean = False
    Dim total As Double = Convert.ToDouble(COSTOTextBox.Text) * 1
    If Pedidos_GeneralDataGridView.Rows.Count > 0 Then

        For Each row As DataGridViewRow In Pedidos_GeneralDataGridView.Rows
            If Convert.ToString(row.Cells(0).Value) = CODIGOTextBox.Text Then

                row.Cells(2).Value = Convert.ToString(1 + Convert.ToInt16(row.Cells(2).Value))
                row.Cells(3).Value = Convert.ToDouble(row.Cells(3).Value) + Convert.ToDouble(COSTOTextBox.Text)
                Found = True
            End If
        Next
        If Not Found Then

            Dim newRow As DataRowView = DirectCast(Pedidos_GeneralBindingSource.AddNew(), DataRowView)

            newRow("CODIGO") = CODIGOTextBox.Text
            newRow("NOMBRE") = NOMBRETextBox.Text
            newRow("CANTIDAD") = CANTIDADTextBox.Text
            newRow("COSTO") = COSTOTextBox.Text

        End If
    End If

solución

El código para crear el origen de datos para el segundo DataGridView y asignarselo.

Dim DT_Segundo as New Datatable
DT_Segundo.Columns.Add("Codigo", Type.GetType("System.String"))
DT_Segundo.Columns.Add("Nombre", Type.GetType("System.String"))
DT_Segundo.Columns.Add("Cantidad", Type.GetType("System.Int32"))
DT_Segundo.PrimaryKey = New DataColumn() {DT_Segundo.Columns("Codigo"), DT_Segundo.Columns("Nombre")}
DataGridView2.DataSource = DT_Segundo

Una vez que tienes eso, lo que debes hacer en la porción de código que compartiste es:

Dim CodigoIngresado as String
Dim NombreIngresado as String
Dim CantidadIngresada As String

CodigoIngresado = CODIGOTextBox.Text
NombreIngresado = NOMBRETextBox.Text
CantidadIngresada = CANTIDADTextBox.Text 

If Not DT_Segundo.Rows.Find({CodigoIngresado,NombreIngresado}) Is Nothing Then
DT_Segundo.Rows.Find({CodigoIngresado,NombreIngresado}).Item("Cantidad") = DT_Segundo.Rows.Find({CodigoIngresado,NombreIngresado}).Item("Cantidad") + CantidadIngresada 
Else
DT_Segundo.Rows.Add(CodigoIngresado,NombreIngresado,CantidadIngresada)
End If

De esta manera, y gracias a que definimos a la columna Código y a la columna Nombre como Clave Primaria, podemos buscar una fila que ya exista con el código y nombre a agregar, y si es así sumarle la cantidad indicada.

EDIT: (En base a más datos aportados en comentarios)

Luego del .Fill que comentas, añade la linea de código que define la clave primaria doble:

Me.Pedidos_GeneralTableAdapter.Fill(Me.PedidosDataSet.Pedido‌​s_General) 
 PedidosDataSet.Pedido‌​s_General.PrimaryKey = New DataColumn() {PedidosDataSet.Pedido‌​s_General.Columns("Codigo"), PedidosDataSet.Pedido‌​s_General.Columns("Nombre")}
DataGridView2.DataSource = PedidosDataSet.Pedido‌​s_General

Luego en donde hacemos la comprobación nos queda:

Dim CodigoIngresado as String
Dim NombreIngresado as String
Dim CantidadIngresada As String

CodigoIngresado = CODIGOTextBox.Text
NombreIngresado = NOMBRETextBox.Text
CantidadIngresada = CANTIDADTextBox.Text 

If Not PedidosDataSet.Pedido‌​s_General.Rows.Find({CodigoIngresado,NombreIngresado}) Is Nothing Then
PedidosDataSet.Pedido‌​s_General.Rows.Find({CodigoIngresado,NombreIngresado}).Item("Cantidad") = PedidosDataSet.Pedido‌​s_General.Rows.Find({CodigoIngresado,NombreIngresado}).Item("Cantidad") + CantidadIngresada 
Else
PedidosDataSet.Pedido‌​s_General.Rows.Add(CodigoIngresado,NombreIngresado,CantidadIngresada)
End If
Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *