miércoles, 25 de julio de 2012

Uso básico Datagridview (DataSet y XML)

A continuación, como llenar de datos un datagridview por medio de un dataset en visual studio 2010 (VB.NET) y guardar los datos en un archivo XML.

La idea es cargar un datagridview con datos manualmente, guardarlos en un archivo XML y cargar otro datagridview con ese mismo archivo.

los pasos son:
  1. Crear un formulario y agregar lo siguiente;
    • 2 datagridview
    • 1 button
  2. El resultado será


  3. Crear una clase llamada XML, la cuál tendrá el siguiente código;

Imports System.IO
Imports System.Xml

Public Class xml

#Region "Members"
    Private xmlDataSet As New DataSet
    'Dirección de donde se creará el archivo, en este caso, es donde se ejecuta     la aplicación.
    Private xmlFile As String = Application.StartupPath + "\clientes.xml"
    Private columns() As String ' Nombre de las columnas
#End Region


Public Sub WriteXmlToFile(ByVal lista As DataGridView)
Try
 Dim ds As New DataSet
 ds = ConvertToTable(lista)
 If ds Is Nothing Then
     Exit Sub
 End If
 If File.Exists(xmlFile) = True Then'si existe el archivo
     File.Delete(xmlFile) 'Borrar el archivo
 End If
 ' Crear el FileStream para escribir
 Dim myFileStream As New System.IO.FileStream(xmlFile, System.IO.FileMode.Create)

 ' crear un XmlTextWriter con el fileStream.
 Dim myXmlWriter As New System.Xml.XmlTextWriter(myFileStream,    System.Text.Encoding.Unicode)

 ' escribir los datos con el método  WriteXml 
 ds.WriteXml(myXmlWriter)'Crear el archivo

Catch ex As Exception
 MessageBox.Show(Err.Description)
Finally
 myXmlWriter.Close()
End Try
End Sub 

Public Sub LoadProcess(ByRef dtv As DataGridView)
 If File.Exists(xmlFile) = False Then
    Exit Sub
 End If
    xmlDataSet = ReadXML() 'Se le asigna un dataset
 Dim filas As Integer = xmlDataSet.Tables(0).Rows.Count - 1
    If filas < 0 Then
       Exit Sub
    End If
       colum()
       dtv.Rows.Clear() 'Limpiar las filas del grid
        For i As Integer = 0 To filas 'Recorrer filas del dataset
            Dim nombre As String = xmlDataSet.Tables(0).Rows(i)(columns(0))
            Dim apellido1 As String = xmlDataSet.Tables(0).Rows(i)(columns(1))
            Dim apellido2 As String = xmlDataSet.Tables(0).Rows(i)(columns(2))
            dtv.Rows.Add(nombre, apellido1, apellido2)
        Next
End Sub 

'Convertir las filas del datagridview en un dataset
    Private Function ConvertToTable(ByVal dgv As DataGridView) As DataSet

        Dim dt As New DataTable()
        ReDim columns(2)
        columns(0) = "Nombre"
        columns(1) = "Primer apellido"
        columns(2) = "Segundo apellido"
        'agregar las columnas al datatable
        dt.Columns.Add(columns(0))
        dt.Columns.Add(columns(1))
        dt.Columns.Add(columns(2))
        'agregar las filas del datagridview
        For Each row As DataGridViewRow In dgv.Rows
            Dim rowdt As DataRow = dt.NewRow()
            rowdt(columns(0)) = Convert.ToString(row.Cells(0).Value)
            rowdt(columns(1)) = Convert.ToString(row.Cells(1).Value)
            rowdt(columns(2)) = Convert.ToString(row.Cells(2).Value)
            dt.Rows.Add(rowdt)   'agregar la fila al datatable
        Next
        Dim ds As New DataSet
        ds.Tables.Add(dt)   'asignar el datatable al dataset
        Return ds
    End Function

' Cargar los datos del archivo XML a un dataset
 Private Function ReadXML() As DataSet 
   Dim ds As New DataSet
   Dim FileSXML As New System.IO.FileStream(xmlFile, System.IO.FileMode.Open)
    Try
      ds.ReadXml(FileSXML)
      ReadXML = ds
      Return ds
    Catch ex As Exception
      MessageBox.Show(Err.Description)
    Finally
      FileSXML .Close()
    End Try
    End Function
End Class

4. Una vez hecho lo anterior, en el evento click de los botones se digita el siguiente código;

Private Sub Button1_Click..........
        Dim obj As New xml
        obj.WriteXmlToFile(DataGridView1)
        obj.LoadProcess(DataGridView2)
End Sub

6.  Al final el resultado será:
llenar el grid con datos (izq) y datos cargados al dar click en el botón (derecha)

ESPERO QUE SEA DE MUCHA UTILIDAD!!

13 comentarios:

  1. Muy buena tu explicación, aunque estoy buscando cargar un Solo datagridview con distintos campos de tablas relacionadas en access.
    Un saludo

    ResponderEliminar
    Respuestas
    1. Gracias..me parece que te puedo ayudar, déjame buscar entre unos proyectos que tengo!!

      Eliminar
  2. Ola como estas, me podrias hacer el favor de enviarme el proyecto a mi correo, porque he tratado de correrlo y me da algunos errores, no se porque. gracias

    llanero012@hotmail.com

    ResponderEliminar
    Respuestas
    1. ola, te cuento que solucione el problema. estoy muy agradecido contigo por ese código.
      me parece la forma mas sencilla de guardar datos de configuración del programa que estoy haciendo. ahora solo me queda ver que tantos datos podría llegar a almacenar, es decir cuantas filas y columnas de un datagrid.
      chao y que estés bien!!!

      Eliminar
    2. Me alegro que te funciono..!! me complace saber que estoy aportando a la educación de colegas!!!

      Eliminar
  3. Muy buen aporte !!! tu codigo y tu explicación esta perfectamente ordenada y se entiende muy bien, suerte y gracias.

    ResponderEliminar
  4. Buenas tardes srta, muy bueno e interesante, quería aprovechar para consultarle, sabe como se puede pasar datos de un datagrid a un dataset y de este dataset ponerlo en un otro datagrid? le agradecería bastante si pudiera ayudarme con ese problema, gracias y saludos cordiales.

    ResponderEliminar
  5. Hola esta muy bien pero ando buscando lo contrario, una vez leido el archivo excell y tenelo en un datagridview, exportar cada fila con sus capos formando un xml, donde cada nodo lo tomaria de cada fila hasta recorer las n filas.
    Si hicistes algo similar me cuentas.
    Saludos.

    ResponderEliminar
  6. Buenos dias por si acaso no tienes el codigo en c#??

    ResponderEliminar
  7. Muy buen aporte.
    Queria hacer una consulta, para que funciona el metodo colum() en el procedimiento loadprocess

    .....
    Dim filas As Integer = xmlDataSet.Tables(0).Rows.Count - 1
    If filas < 0 Then
    Exit Sub
    End If
    **** colum() ************
    dtv.Rows.Clear() 'Limpiar las filas del grid
    For i As Integer = 0 To filas 'Recorrer filas del dataset
    Dim nombre As String = xmlDataSet.Tables(0).Rows(i)(columns(0))
    .......
    ......
    ....

    ResponderEliminar
  8. oh creo que se borro mi comentario....

    se puede hacer esto:

    For i As Integer = 0 To 2
    rowdt(i) = row.Cells(i).Value
    Next
    en vez de
    rowdt(columns(0)) = row.Cells(0).Value
    rowdt(columns(1)) = row.Cells(1).Value
    rowdt(columns(2)) = row.Cells(2).Value


    lo intente con un for, pero me sale que no acepta valores double, siendo mi primer valor 1 en entero o un nombre en string.

    lo hago porque quiero pasar un grid a un dataset pero con muchas columnas.

    ResponderEliminar
  9. Tengo el archivo XML con diferentes campos entre ellos obra y año y quiere cargar el XML a un datagridview pero con una condicional...osea todas las obras del año 2012.
    Espero me entiendan y de ante mano agradezco.
    Saludos
    zapatacastrodavid@gmail.com

    ResponderEliminar
  10. Disculpa me podrias ayudar para poder agragar filas a un datagridview que se encuentra enlazado a datos.

    Te explico.

    Tengo un formulario el cual contiene un texbox y un datagridview. Cuando se introduce un codigo en el textbox y se precione enter se busca en la bd y me muestra el resultado en el datagridview.

    Si quiero seguir introduciendo codigos al textbox se vayan añadiendo al datagridview.

    Solo puedo hacer que se muestre una fila y si busco un nuevo codigo se sobreescribe el que ya estaba.

    Te dejo mi correo si me puedes ayudar.

    frank33bet@gmail.com

    Saludos

    ResponderEliminar