none
Añadir valores a columna creada en DataGridView RRS feed

  • Pregunta

  • Con el codigo que adjunto intento crear una columna donde recoger un valor dependiente de otra columna ya existente en la consulta.

    la columna se crea, pero no consigo que apareza ningún valor en las celdas correspondientes.

    ¿Cual es la forma de hacerlo?

    Gracias,

     

     With dgvAcumulados
                .DataSource = CrearTabla("SumCajasEnAlmacenByCodigoLote ")

                Dim NewColumna As New DataGridViewTextBoxColumn
                NewColumna.Name = "Lote"
                .Columns.Add(NewColumna)

                Dim m_row As New DataGridViewRow
                For Each m_row In dgvAcumulados.Rows
                    m_row.Cells("Lote").Value = DevuelveFechaJuliana(m_row.Cells("Fecha").Value)
                Next

            
            End With


    Miguel Angel Martinez correomam@gmail.com
    • Cambiado Enrique M. Montejo jueves, 29 de septiembre de 2011 17:06 acceso a datos (De:Lenguaje VB.NET)
    viernes, 20 de agosto de 2010 9:17

Todas las respuestas

  • En un principio el código parece correcto, 

     

    Podrias hacer una depuración y ver si está devolviendo datos las filas y el valor de la Fecha?


    Para el correcto funcionamiento, y que otros usuarios se puedan beneficiar de la solucion de esta pregunta por favor marca las respuestas que te hayan ayudado como "Respuesta".
    Si la respuesta te ha sido util Votala.
    Mi Blog: Jtorrecilla
    Enlace a Faq de Winforms en Ingles Muy bueno
    viernes, 20 de agosto de 2010 9:21
    Moderador
  • Si, las devuelve y las muestra perfectamente.

     


    Miguel Angel Martinez correomam@gmail.com
    viernes, 20 de agosto de 2010 9:54
  • Mira he hecho este pequeño ejemplo:

        Dim t As New DataTable
        t.Columns.Add("a")
        t.Columns.Add("b")
        t.Columns.Add("c")
        Dim r As DataRow
    
        For I As Integer = 0 To 1500
          r = t.NewRow
          r("a") = I
          r("b") = I + 1
          r("c") = I + 2
          t.Rows.Add(r)
        Next
        Me.DataGridView1.DataSource = t
        Me.DataGridView1.Columns.Add("Z", "Z")
        For Each row As DataGridViewRow In Me.DataGridView1.Rows
          If CInt(row.Cells("a").Value) Mod 2 = 0 Then
            row.Cells("Z").Value = "True"
          Else
            row.Cells("Z").Value = "False"
          End If
        Next
    

    Y a mi si me pone valores en Z de forma correcta.

     


    Para el correcto funcionamiento, y que otros usuarios se puedan beneficiar de la solucion de esta pregunta por favor marca las respuestas que te hayan ayudado como "Respuesta".
    Si la respuesta te ha sido util Votala.
    Mi Blog: Jtorrecilla
    Enlace a Faq de Winforms en Ingles Muy bueno
    viernes, 20 de agosto de 2010 10:00
    Moderador
  • Con tu mismo codigo a mi me deja la columna Z vacia :-(

     


    Miguel Angel Martinez correomam@gmail.com
    viernes, 20 de agosto de 2010 10:45
  • Umh,

    Que versión de VS estás usando?

     

    Donde estás poniendo el código?


    Para el correcto funcionamiento, y que otros usuarios se puedan beneficiar de la solucion de esta pregunta por favor marca las respuestas que te hayan ayudado como "Respuesta".
    Si la respuesta te ha sido util Votala.
    Mi Blog: Jtorrecilla
    Enlace a Faq de Winforms en Ingles Muy bueno
    viernes, 20 de agosto de 2010 10:46
    Moderador
  • Uso 2008 Profesional con SP1

    El codigo lo pongo el el Load

     


    Miguel Angel Martinez correomam@gmail.com
    viernes, 20 de agosto de 2010 11:20
  • Hola:
    EJEMPLO1
    Un Form con 1 boton (btnColumnaCalculada) y 1 DataGridView (DataGridView1)
    Pegar el siguiente codigo.

    Imports System.Data.SqlClient

    Public Class Form1
        Inherits System.Windows.Forms.Form
        Private oConnection As SqlConnection
        Private oDataAdapter As SqlDataAdapter
        Private oDataSet As DataSet
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            ' carga inicial del dataset y datagrid
            oConnection = New SqlConnection("Data Source=.\SQLEXPRESS;Initial Catalog=Northwind;Integrated Security=True")
            oDataAdapter = New SqlDataAdapter("SELECT OrderID,CustomerID,Freight FROM Orders", oConnection)
            oDataSet = New DataSet
            oConnection.Open()
            oDataAdapter.Fill(oDataSet, "Orders")
            oConnection.Close()
            Me.DataGridView1.DataSource = oDataSet
            Me.DataGridView1.DataMember = "Orders"
        End Sub

        Private Sub btnColumnaCalculada_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnColumnaCalculada.Click
            ' al pulsar un botón, recuperamos del dataset asignado al datagrid
            ' un objeto dataview al que le añadimos una columna calculada,
            ' finalmente añadimos el dataview al datagrid
            Me.DataGridView1.DataSource = Nothing
            Dim colNueva As DataColumn = New DataColumn("ValorDoble")
            colNueva.Expression = "Freight * 2"
            Dim dvVistaDatos As DataView = oDataSet.Tables("Orders").DefaultView
            dvVistaDatos.Table.Columns.Add(colNueva)
            Me.DataGridView1.DataSource = dvVistaDatos
            Me.btnColumnaCalculada.Enabled = False
        End Sub
    End Class

    EJEMPLO2
    Un Form con 1 DataGridView (DataGridView1)
    Pegar el siguiente codigo.

    Imports System.Data.SqlClient
    Public Class Form1
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            Dim cnConexion As SqlConnection = New SqlConnection()
            cnConexion.ConnectionString = "Data Source=.\SQLEXPRESS;Initial Catalog=AdventureWorks;Integrated Security=True"
            Dim sSQL As String
            sSQL = "select ProductID,StandardPrice,LastReceiptCost,(LastReceiptCost-StandardPrice) as Diferencia  "
            sSQL &= "from Purchasing.ProductVendor"
            Dim cmdComando As SqlCommand = New SqlCommand(sSQL, cnConexion)
            Dim daAdaptador As SqlDataAdapter = New SqlDataAdapter(cmdComando)
            Dim dsDatos As DataSet = New DataSet()
            daAdaptador.Fill(dsDatos, "ProductVendor")
            Me.DataGridView1.DataSource = dsDatos
            Me.DataGridView1.DataMember = "ProductVendor"
            Dim DobleDiferencia As DataGridViewTextBoxColumn = New DataGridViewTextBoxColumn()
            DobleDiferencia.HeaderText = "Doble Diferencia precios"
            DobleDiferencia.Name = "Doble Diferencia"
            Me.DataGridView1.Columns.Add(DobleDiferencia)
        End Sub

        Private Sub DataGridView1_CellFormatting(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellFormattingEventArgs) Handles DataGridView1.CellFormatting
            If Me.DataGridView1.Columns(e.ColumnIndex).Name = "Doble Diferencia" Then
                Dim ldDiferencia As Double = CDbl(Me.DataGridView1.Rows(e.RowIndex).Cells("Diferencia").Value)
                e.Value = ldDiferencia * 2
            End If
        End Sub
    End Class

    Espero que te sirva
    Un saludo desde Bilbo
    Carlos

    viernes, 20 de agosto de 2010 11:23
  • Pues si has probado el código tal cual lo he puesto deberia funcionarte de forma correcta...

     

    Si quieres sube el proyecto a algun servidor y lo miramos mas en detalle...


    Para el correcto funcionamiento, y que otros usuarios se puedan beneficiar de la solucion de esta pregunta por favor marca las respuestas que te hayan ayudado como "Respuesta".
    Si la respuesta te ha sido util Votala.
    Mi Blog: Jtorrecilla
    Enlace a Faq de Winforms en Ingles Muy bueno
    viernes, 20 de agosto de 2010 11:29
    Moderador
  • Sigo haciendo pruebas:

    Si pongo el DataGridView dentro de un Tab de un TabControl no actualiza la columna creada, si lo saco del Tab si funciona perfectamente, pero esto es cierto solo en este Form en concreto, si hago lo mismo en un Form que creo con un TabControl y hago lo mismo funciona perfectamente.

    ¿alguna idea?

     

     


    Miguel Angel Martinez correomam@gmail.com
    viernes, 20 de agosto de 2010 11:54
  • No tiene ningun sentido que dentro del TAB no te funcione y fuera si, y en otro form si te funcione...

     

    No tendrás algo en código que evita que se rellene la columna??


    Para el correcto funcionamiento, y que otros usuarios se puedan beneficiar de la solucion de esta pregunta por favor marca las respuestas que te hayan ayudado como "Respuesta".
    Si la respuesta te ha sido util Votala.
    Mi Blog: Jtorrecilla
    Enlace a Faq de Winforms en Ingles Muy bueno
    viernes, 20 de agosto de 2010 11:58
    Moderador
  • hola

    solo para descartar que no sea un problema d ela column generada dinamicamene

    no has probado crear en e dseñador esa columna, no desde codigo sin especificar la propiedad DataPropertyName

    esto debria bindear todas las columna menos esta, la cual la accederias e el loop

     

               With dgvAcumulados
                   .DataSource = CrearTabla("SumCajasEnAlmacenByCodigoLote ")


                   For Each m_row As DataGridViewRow In dgvAcumulados.Rows
                       m_row.Cells("Lote").Value = DevuelveFechaJuliana(m_row.Cells("Fecha").Value)
                   Next

              End With

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    viernes, 20 de agosto de 2010 12:09
  • hola

    solo para descartar que no sea un problema d ela column generada dinamicamene

    no has probado crear en e dseñador esa columna, no desde codigo sin especificar la propiedad DataPropertyName

    esto debria bindear todas las columna menos esta, la cual la accederias e el loop

     

               With dgvAcumulados
                   .DataSource = CrearTabla("SumCajasEnAlmacenByCodigoLote ")


                   For Each m_row As DataGridViewRow In dgvAcumulados.Rows
                       m_row.Cells("Lote").Value = DevuelveFechaJuliana(m_row.Cells("Fecha").Value)
                   Next

              End With

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina


    Leandro:

    No es problema de la columna, es algo relacionado con el control TabControl de ese formulario en concreto.

     


    Miguel Angel Martinez correomam@gmail.com
    viernes, 20 de agosto de 2010 12:46
  • Al final que como ha quedado el tema mam01?
    Para el correcto funcionamiento, y que otros usuarios se puedan beneficiar de la solucion de esta pregunta por favor marca las respuestas que te hayan ayudado como "Respuesta".
    Si la respuesta te ha sido util Votala.
    Mi Blog: Jtorrecilla
    Enlace a Faq de Winforms en Ingles Muy bueno
    domingo, 22 de agosto de 2010 19:30
    Moderador
  • Pues sigo sin conseguir que muestre la columna calculada, y no veo nada en el Form que lo haga diferente al resto.
    Miguel Angel Martinez correomam@gmail.com
    lunes, 23 de agosto de 2010 15:28
  • pues puedo dar una idea mas,

    en lugar de agregarle la columna al DataGridView

    agrégala a tu Datatable que tienes enlazado al DGV

     

    esa es la forma en que yo lo haria

     Dim Tabla1 As DataTable = New DataTable("SumCajasEnAlmacenByCodigoLote")
            Ds.Tables.Add(Tabla1)
            Tabla1.Columns.Add("Lote", Type.GetType("System.Int32"))
    

     

    donde quiero suponer tabla1 está enlazada con el DataGridView

    me gustaría que dieras un poquito mas de detalle

     

    para ver si en lugar de actualizar el DGV mejor actualizas la tabla

    saludos

     

     

     

     

     

     

    lunes, 23 de agosto de 2010 15:45
  • pues puedo dar una idea mas,

    en lugar de agregarle la columna al DataGridView

    agrégala a tu Datatable que tienes enlazado al DGV

     

    esa es la forma en que yo lo haria

     

     Dim
     Tabla1 As
     DataTable = New
     DataTable("SumCajasEnAlmacenByCodigoLote"
    )
        Ds.Tables.Add(Tabla1)
        Tabla1.Columns.Add("Lote"
    , Type.GetType
    ("System.Int32"
    ))
    

     

     

    donde quiero suponer tabla1 está enlazada con el DataGridView

    me gustaría que dieras un poquito mas de detalle

     

    para ver si en lugar de actualizar el DGV mejor actualizas la tabla

    saludos

     

     

     

     

     

     


    Omar:

    Si, puedo hacer lo quer tu dices, pero mas facil es añadir ese campo al Select de la consulta que genera la tabla.

    Es una cuestión de curiosidad de porque funciona en el resto de Form y en este en concreto no.

    Gracias.


    Miguel Angel Martinez correomam@gmail.com
    lunes, 23 de agosto de 2010 17:44
  • pues puedo dar una idea mas,

    en lugar de agregarle la columna al DataGridView

    agrégala a tu Datatable que tienes enlazado al DGV

     

    esa es la forma en que yo lo haria

     

     Dim
     Tabla1 As
     DataTable = New
     DataTable("SumCajasEnAlmacenByCodigoLote"
    )
        Ds.Tables.Add(Tabla1)
        Tabla1.Columns.Add("Lote"
    , Type.GetType
    ("System.Int32"
    ))
    

     

     

    donde quiero suponer tabla1 está enlazada con el DataGridView

    me gustaría que dieras un poquito mas de detalle

     

    para ver si en lugar de actualizar el DGV mejor actualizas la tabla

    saludos

     

     

     

     

     

     


    Omar:

     

    He probado con

     

     Dim m_Tabla As DataTable = CrearTabla("SumCajasEnAlmacenByCodigoLote ")
            m_Tabla.Columns.Add("Lote", Type.GetType("System.Int32"))
            For Each m_row As DataRow In m_Tabla.Rows
                m_row.Item("Lote") = DevuelveFechaJuliana(m_row.Item("Fecha"))
                'Para verificar que crea el Item con su valor correcto, y efectivamente lo hace
                'MsgBox(m_row.Item("Lote"))
            Next

    Crea la columna con su valores correctos, pero no los muestra en el DataGridView :-(

     

     


    Miguel Angel Martinez correomam@gmail.com
    lunes, 23 de agosto de 2010 18:03
  • asi es ahora te falta entonces

    el bound column properties

     

    sabes como hacer eso desde el GridView?

     

    en la parte superior derecha del grid dale a la flechita

    luego dale a editar columnas

    y luego agrega la columna y en la parte derecha en Data hay una opcion

    llamada DataPropertyName, alli escribies el nombre de la columna que quieres

    que te enlace lotes me parece

    si no escribie de nuevo

    ahorita lo arreglamos como no

    lunes, 23 de agosto de 2010 18:26
  • asi es ahora te falta entonces

    el bound column properties

     

    sabes como hacer eso desde el GridView?

     

    en la parte superior derecha del grid dale a la flechita

    luego dale a editar columnas

    y luego agrega la columna y en la parte derecha en Data hay una opcion

    llamada DataPropertyName, alli escribies el nombre de la columna que quieres

    que te enlace lotes me parece

    si no escribie de nuevo

    ahorita lo arreglamos como no


    Eso ya lo hago por codigo

      With dgvAcumulados
                .DataSource = CrearTabla("SumCajasEnAlmacenByCodigoLote ")

                Dim NewColumna As New DataGridViewTextBoxColumn
                NewColumna.Name = "Lote"
                .Columns.Add(NewColumna)

                Dim m_row As New DataGridViewRow
                For Each m_row In dgvAcumulados.Rows
                    m_row.Cells("Lote").Value = DevuelveFechaJuliana(m_row.Cells("Fecha").Value)
                Next

            
            End With

     

    La solución debe ser por codigo, no en modo diseño.

     

    Gracias.

     

     


    Miguel Angel Martinez correomam@gmail.com
    martes, 24 de agosto de 2010 4:26
  • hola mam01, con la solucion que te da Omar no tienes que poner todo el código que tienes puesto tu: con poner esto valdria:

    With dgvAcumulados
                .DataSource = CrearTabla("SumCajasEnAlmacenByCodigoLote ")

                      
            End With

     

    Porque se supone que en la función tabla has puesto que agregue en el Datatable el campo de la fechaJuliana.

     

    De todas maneras me sigue pareciendo muy raro que las soluciones que te hemos indicado arriba no te hayan funcionado.

     

    Podrias subir tu código a algun sitio para ver si hay alguna cosa rara?


    Para el correcto funcionamiento, y que otros usuarios se puedan beneficiar de la solucion de esta pregunta por favor marca las respuestas que te hayan ayudado como "Respuesta".
    Si la respuesta te ha sido util Votala.
    Mi Blog: Jtorrecilla
    Enlace a Faq de Winforms en Ingles Muy bueno
    martes, 24 de agosto de 2010 5:57
    Moderador
  • si la creas en tiempo de ejecución

    te falta el DataPropertyName enlazarlo a Lote

     

     

    martes, 24 de agosto de 2010 11:34
  • si la creas en tiempo de ejecución

    te falta el DataPropertyName enlazarlo a Lote

     

     


    Omar:

     

    Podrias poner un ejemplo con el codigo completo.

     

    Gracias.

     

     


    Miguel Angel Martinez correomam@gmail.com
    martes, 24 de agosto de 2010 12:01