aGrAdEcEr Es CoMpArTiR... CoMpArTe Lo QuE tE gUsTó A TuS ReDeS SoCiALeS... Twitter, Google+ y Facebook.

Wednesday, March 30, 2011

CóMo PaSaR Los DaToS De uN GridView a Un DataTable

ASP.NET, VB.NET

Se podría dar el caso de que las celdas de un GridView sean generadas o ingresadas por el usuario en tiempo de ejecución. Es decir, lo que se muestra en el GridView no son datos bindeados.

Para poder recuperar estos datos, no existe un método como tal. Por tanto, hay que programarlo.

Es sencillo, primero hay que crear la estructura del DataTable. Por ejemplo:

Public Sub prcCrearEstructuraDatatable()
        Dim dt As New DataTable
        dt.Columns.Add("inProdNcod")
        dt.Columns.Add("inProdCodg")
        dt.Columns.Add("vtLisDPrec")
        dt.Columns.Add("vtLisDDsct")
        dt.Columns.Add("vtLisDMoni")
        dt.Columns.Add("vtLisDMarg")
        dt.Columns.Add("vtLisMNcod")
        dt.Columns.Add("vtLisDNcod")
        Me.ViewState("dtDetalle") = dt
    End Sub



(Meto el DataTable dentro de un ViewState para luego poder manipular la tabla en cualquier momento)

Luego de haber cargado los datos al Gridview, los cuales se desea guardarlos, le hacemos un For Each y metemos en cada fila del DataTable lo que hay en cada celda del GridView, las celdas que deseemos. Para ello, recuperamos la estructura del DataTable la cual está en el ViewState. Y al final, hacemos el caso inverso, asignamos lo que hay en el DataTable ahora al ViewState (esto es para la manipulación posterior de los datos)

Public Function fncCargarDataTable(ByRef strMensaje As String) As Boolean
    Me.prcCrearEstructuraDatatable()
    Dim dt As DataTable = Me.ViewState("dtDetalle")
    If Me.grvListaDePrecios.Rows.Count > 0 Then
        For Each fila As GridViewRow In Me.grvListaDePrecios.Rows
            Dim f As DataRow = dt.NewRow()
            Dim txtDescuento As TextBox = DirectCast(fila.Cells(6).Controls(1), TextBox)

            f("inProdNcod") = DirectCast(fila.Cells(8).Controls(1), Label).Text
            f("inProdCodg") = fila.Cells(1).Text
            f("vtLisDPrec") = DirectCast(fila.Cells(4).Controls(1), TextBox).Text
            f("vtLisDDsct") = IIf(txtDescuento.Text = "", "0", txtDescuento.Text)
            If txtDescuento.Text = "" Then
                txtDescuento.Text = "0"
            End If
            f("vtLisDMoni") = DirectCast(fila.Cells(4).Controls(7), DropDownList).SelectedValue
            f("vtLisDMarg") = DirectCast(fila.Cells(5).Controls(1), Label).Text
            f("vtLisMNcod") = Me.ViewState("EstadoID")
            f("vtLisDNcod") = DirectCast(fila.Cells(9).Controls(1), Label).Text

            dt.Rows.Add(f)
        Next
        Me.ViewState("dtDetalle") = dt
    Else
        strMensaje = "Debe generar la lista de precios antes de guardarla."
        Return False
    End If
    Return True
End Function


=) HaPPy CoDiNg!

3 comments:

  1. hola amiga me ayudas con un formulario venta para pasar un valor a una datagriview te dejo mi mail calbanc@gmail.com

    ReplyDelete
  2. Hola buen dia.
    Tengo una pregunta como controlar el tamaño de tu columna por ejemplo
    dt.Columns.Add("inProdNcod"), habra una propiedad de de width height

    Me podrias ayudar.

    Gracias

    ReplyDelete
  3. Antonio, el ancho yo lo controlo desde la grilla. Y sería algo así:

    Me.Grilla.Columns("inProdNcod").Width = 120

    ReplyDelete