viernes, 8 de marzo de 2013

Actualizar datos de una lista genérica con LINQ

A continuacion tenemos una ejemplo con LINQ y CurrencyManager que nos permitirá actualizar los datos de una lista genérica, esto también se pude trabajar con datos extraídos desde una base de datos.


Código fuente


Paso 1: Creamos una clase llamada oProducto

Public Class oProducto
    Public Property Codigo As Integer
    Public Property producto As String
    Public Property precio As Double
    Public Property cantidad As Integer
    Public Property estado As String
End Class


Paso 2: Declaramos una variable de tipo Lista

Dim loProducto As New List(Of oProducto)

Paso 3: Programamos el botón agregar

Private Sub btnAgregar_Click(ByVal sender As System.ObjectByVal e As System.EventArgsHandles btnAgregar.Click
Try
   'Capturamos el text del btnAgregar
   Dim oControl As Control = sender
   Select Case oControl.Text
   Case "Agregar"
      'Declaramos una variable de tipo oProducto, luego asignamos los valores de los textbox
      Dim oProducto As New oProducto
      With oProducto
        .Codigo = txtCodigo.Text
        .producto = txtProducto.Text
        .cantidad = CInt(txtCantidad.Text)
        .precio = CDbl(txtPrecio.Text)
        'Verificamos si el chekEstado esta seleccionado 
        'se le asignara Activo de lo contrario sera Inactivo
        .estado = If(chkEstado.Checked = True"Activo""Inactivo")
      End With
        'Agregamos los elementos de la clase a la lista de oProducto
        loProducto.Add(oProducto)

        'llamamos al procediento
        Listar_productos()

        'invocamos al evento Click del boton Nuevo
        btnNuevo_Click(sender, e)
   Case Else
        'Capturamos el valor del txtCodigo ,
        'que permitira filtra cual elemto de la clase vamos a actulizar
        Dim oCodigo As Integer = CInt(txtCodigo.Text)
        'Mediente LINQ filtramos el elemento por su codigo
        Dim query = (From p In loProducto
                      Where p.Codigo = oCodigo).Single
        'Asignamos los nuevos valores a la elemetos de la clase
        query.producto = txtProducto.Text
        query.precio = txtPrecio.Text
        query.cantidad = txtCantidad.Text
        query.estado = If(chkEstado.Checked = True"Activo""Inactivo")

        'Actualizamos los nuevos datos de la clase oProducto
        Dim cm As CurrencyManager
        cm = Me.BindingContext(loProducto)
        cm.Refresh()

        'llamamos al procediento donde se encuentar los productos
        Listar_productos()

        'invocamos al evento Click del boton Nuevo
         btnNuevo_Click(sender, e)
     End Select

Catch ex As Exception
    MessageBox.Show("Error al registrar producto.""vb.net"MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try
End Sub

Paso 4: Creamos una procedimiento que permita listar los datos de la clase

Sub Listar_productos()
Try
  'si la lista de objetos es diferente de Nothing
  If (loProducto IsNot NothingThen
  'Borramos los rows del datagridview
      dtgProductos.Rows.Clear()
   'loProducto.count , podremos saber cuantos elemento contiene nuestra clase
     For rows As Integer = 0 To loProducto.Count - 1
       dtgProductos.Rows.Add()
       'asignamos los valores
       dtgProductos("txt_dtgCodigo", rows).Value = loProducto(rows).Codigo
       dtgProductos("txt_dtgProducto", rows).Value = loProducto(rows).producto
       dtgProductos("txt_dtgCantidad", rows).Value = loProducto(rows).cantidad
       dtgProductos("txt_dtgPrecio", rows).Value = loProducto(rows).precio
       dtgProductos("txt_dtgEstado", rows).Value = loProducto(rows).estado
    Next
 End If
Catch ex As Exception
        MessageBox.Show("Error mientras se listaba los productos...""vb.net"MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try
End Sub

Paso 5: Programamos el botón nuevo

Private Sub btnNuevo_Click(ByVal sender As System.ObjectByVal e As System.EventArgsHandles btnNuevo.Click
        btnAgregar.Text = "Agregar"
        txtCodigo.Clear()
        txtProducto.Clear()
        txtCantidad.Clear()
        txtPrecio.Clear()
        chkEstado.Checked = True
        txtCodigo.Focus()
End Sub

Paso 6: Cuando el usuario selección e una celda del gridview, asignaremos los valores a los textos

Private Sub dtgProductos_CellClick(ByVal sender As System.ObjectByVal e As System.Windows.Forms.DataGridViewCellEventArgsHandles dtgProductos.CellClick
Try
   'Si el rosIndex es mayor de 0 , asignara a los textbox el valor de las celdas de la datagridview
  If (e.RowIndex > -1) Then
   txtCodigo.Text = CInt(dtgProductos("txt_dtgCodigo", e.RowIndex).Value)
   txtProducto.Text = dtgProductos("txt_dtgProducto", e.RowIndex).Value
   txtCantidad.Text = dtgProductos("txt_dtgCantidad", e.RowIndex).Value
   txtPrecio.Text = dtgProductos("txt_dtgPrecio", e.RowIndex).Value
   chkEstado.Checked = If(dtgProductos("txt_dtgEstado", e.RowIndex).Value = "Activo"TrueFalse)
    'cambiamos el text del botón btnAgregar
    btnAgregar.Text = "Actualizar"
 End If
Catch ex As Exception
    MessageBox.Show("Error""vb.net"MessageBoxButtons.OK, MessageBoxIcon.Error)
        End Try
End Sub

Resultado

En esta imagen se muestra los datos de la lista actualizados y como podremos ver el Estado del "producto D" se muestra Inactivo de esta forma podemos actualizar los elementos de la lista genérica.

No hay comentarios:

Publicar un comentario