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!