none
Vincular un DataGridView y un Chart, 'desfase' de un cambio. RRS feed

  • Pregunta

  • Hola:

    Quiero mostrar unos datos (datatable) en un DataGridView y un gráfico correspondiente a los datos mostrados, para ello asigno los correspondientes DataSource a los objetos, con la intención de que cualquier cambio en el DataGridView se refleje automáticamente en el Chart, pero tengo un 'desfase' entre los datos del DataGridView y el chart, y no entiendo la razón!.

    Un ejemplo, en un formulario nuevo añadimos un DataGridView y un Chart (ambos de Windows Forms) y copiamos este código que lo único que hace es cargar un datatable y asignarlo a los objetos correspondientes:

        Dim dt As New DataTable
    
        Private Sub Form_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            dt.Columns.Add("DSC", GetType(String))
            dt.Columns.Add("Valor", GetType(Double))
    
            dt.Rows.Add("A", 15)
            dt.Rows.Add("B", 10)
            dt.Rows.Add("C", 10)
            dt.Rows.Add("D", 10)
            dt.Rows.Add("E", 10)
    
            dt.Columns.Add("PCT", GetType(Double)).Expression = "Valor / SUM(Valor)"
    
            ' Asignamos el DataTable al DataGrid
            Me.DataGridView1.DataSource = dt
    
            ' Asignamos el DataTable al CHART
            Me.Chart1.DataSource = dt
    
            ' Definimos el Chart.
            With Me.Chart1.Series("Series1")
                .XValueMember = "DSC"
                .YValueMembers = "PCT"
            End With
    
            ' Actualizamos el gráfico
            Me.Chart1.DataBind()
    
        End Sub


    Luego, cuando cambio algo en el DatagridView, uso el evento CellEndEdit() para 'refrescar' el chart

        Private Sub DataGridView1_CellEndEdit(sender As Object, e As DataGridViewCellEventArgs) Handles DataGridView1.CellEndEdit
            ' Actualizamos el gráfico
            Me.Chart1.DataBind()
        End Sub

    Pues bien, cuando cambio algo en el DataGridView, no me muestra el cambio en el chart!!! Va con un cambio de 'desfase', es decir, hago un primer cambio y no se muestra dicho cambio el Chart. Cuando hago un segundo cambio, entonces me muestra el primer cambio, etc.

    Podéis comprobarlo cambiando todos los valores de la columna VALOR a 1, y vereis que cuando tengas TODOS los valores a 1, en el gráfico el ultimo valor no ha cambiado todavia.

    ¿Como vincular/sincronizar un DataGridView y un Chart, para que los cambios se muestren automáticamente e inmediatamente?

    Un saludo


    • Editado LG DES martes, 17 de enero de 2017 15:00
    • Cambiado Enrique M. Montejo domingo, 22 de enero de 2017 11:52 Pregunta relacionada con controles de Windows Forms.
    martes, 17 de enero de 2017 14:59

Todas las respuestas

  • Hola LG.

    En el CellEndEdit, prueba a recargar todo el gráfico.

    Private Sub DataGridView1_CellEndEdit(sender As Object, e As DataGridViewCellEventArgs) Handles DataGridView1.CellEndEdit
            ' Asignamos el DataTable al CHART
           
    Me.Chart1.DataSource = dt

           
    ' Definimos el Chart.
           
    With Me.Chart1.Series("Series1")
               
    .XValueMember = "DSC"
               
    .YValueMembers = "PCT"
           
    End With
    End Sub

    Un saludo.

    Gemma

    • Propuesto como respuesta Joyce_AC miércoles, 18 de enero de 2017 15:55
    • Votado como útil LG DES viernes, 10 de febrero de 2017 11:28
    martes, 17 de enero de 2017 17:02
  • Hola:

    Recrear el gráfico es una posible solución, pero lo expuesto es un ejemplo. En el caso 'real' es bastante más complicado y sería interesante 'refrescar' el gráfico, y no estar constantemente creando y configurando el gráfico (datos, series, etiquetas, colores, formatos, etc-etc.).

    Un saludo

    miércoles, 18 de enero de 2017 16:12