none
Como detectar un cambio en la celda del DataGridView RRS feed

  • Pregunta

  • Tengo ligado mi DataGridView a una tabla dentro del  Dataset
    y cuando modifica la tabla directamente se modifica mi GridView en automático
    ahora lo que quiero es detectar en mi GridView cual celda es la que está cambiando

    lo he intentado con el siguiente evento pero no funciona:
    CellValueChanged


    la idea es que me presente en el GridView negritas a los campos
    que han cambiado.



    lo quiero hacer mediante eventos esperando sea más ágil porque ahorita como lo estoy haciendo
    es muy muy lento
     Dim Negritas As Font
                    Dim Color As Color = Drawing.Color.Black
    
                    Negritas = New Font("Tahoma", 8, FontStyle.Bold)
    
    
    
                    If RegFind(0)("TradeId") Is DBNull.Value = False Then
                        If RegFind(0)("TradeId") <> CampoTradeId Then
                            Dg.Rows(Posicion).Cells("TradeId_").Style.Font = Negritas
                            Dg.Rows(Posicion).Cells("TradeId_").Style.ForeColor = Color
                        End If
                    Else
                        Dg.Rows(Posicion).Cells("TradeId_").Style.Font = Negritas
                        Dg.Rows(Posicion).Cells("TradeId_").Style.ForeColor = Color
                    End If
                    RegFind(0)("TradeId") = CampoTradeId
    



    Es muy lento porque tengo 50 columnas, necesito encontrar algo mas rápido
    se está tardando como 4 segundos en poner las celdas con negritas

    alguna idea mejor?

    muchas gracias


    miércoles, 30 de diciembre de 2009 21:39

Respuestas

  • "OMAR OLGUIN" escribió:

    > Tengo ligado mi DataGridView a una tabla dentro del  Dataset
    > y cuando modifica la tabla directamente se modifica mi GridView en automático
    > ahora lo que quiero es detectar en mi GridView cual celda es la que está cambiando

    Hola, Omar:

    Si los datos los modificas directamente en el objeto DataTable llamado "fxo" existentes en un objeto DataSet, el evento que tienes que detectar es el evento ColumnChanging del objeto DataTable, el cual se desencadenará cuando se está modificando un campo del objeto DataTable.

        Private Sub DataTableOnColumnChanging(sender As Object, e As DataColumnChangeEventArgs)

            ' Referenciamos el objeto DataRow que se está modificando.
            '
            Dim row As DataRow = e.Row

            ' Obtenemos el índice del objeto DataRow.
            '
            Dim index As Integer = m_dt.Rows.IndexOf(row)

            Dim negritas As Font = New Font("Tahoma", 8, FontStyle.Bold)

            Dim color As Color = Drawing.Color.Black

            ' Cambiamos el estilo de la celda que se corresponde
            ' con el valor de un campo del objeto DataRow.
            '
            Dg.Rows(index).Cells("TradeId_").Style.Font = negritas
            Dg.Rows(index).Cells("TradeId_").Style.ForeColor = color

        End Sub

    Como se puede observar, en el procedimiento estoy haciendo uso de un campo llamado «m_dt», el cual se encuentra declarado a nivel del formulario de la siguiente manera:

        Private m_dt As DataTable

    En el evento Load del formulario, y una vez que hayas rellenado el objeto DataSet, referenciarías el objeto DataTable de la siguiente manera:

        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

            m_dt = Ds.Tables("fxo")

            ' Enlazamos el control DataGridView con el objeto DataTable
            '
            Dg.DataSource = m_dt

            ' Instalamos el controlador para el evento ColumnChanging
            ' del control DataGridView.
            '
            AddHandler m_dt.ColumnChanging, AddressOf DataTableOnColumnChanging

        End Sub

    Cuando desees modificar un registro, ejecutarías lo que estás ejecutando:

        Dim reg() As DataRow = m_dt.Select("Id = 1")

        reg(0)("TradeDate") = "2009/02/31"

        Reg(0).EndEdit()

    Un saludo


    Enrique Martínez
      [MS MVP - VB]

    viernes, 1 de julio de 2011 21:35
    Moderador

Todas las respuestas

  • hola

    segun entiendo lo que intentas hacer es validar si el valor de la celda cambio para asi cambiar el estilo

    porque no usas combinado dos eventos por ejemplo el CellBeginEdit
    y en este lo que haces es caputar el valor de la celda guardanola en una variable

    luego en el CellEndEdit o CellValueChanged

    comparar alli el valor que antes capturaste en el BeginEdit


    saludos
    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    miércoles, 30 de diciembre de 2009 21:59
  • Ya lo he intentado asi pero no se disparan dichos eventos, 
    pienso porque no los estoy editando directamente en el DatagridView 
    mas bien lo estoy haciendo desde un table dentro de un DataSet, que esta enlazado al gridview



     Dim Reg() As DataRow
        
              
                Reg = Ds.Tables("fxo").Select("Id = "1")

    Reg(0)("TradeDate") = "2009/02/31"
    reg(0).endedit

    automáticamente cambio el valor en la celda del DataGridView, sin disparar los eventos que dices
    como le hago?

    entiendes muy bien lo que quiero hacer, hay otra forma de hacerlo de forma eficiente?
    tks
    jueves, 31 de diciembre de 2009 16:41

  • hola

    ahh lo que haces es modificar los valores en el dataset y quires que esto se reflejen en la grilla ?

    si es asi simplemente deberias volver a bindearla

    o sea modificas el dataset o mejor dicho la celda en el datatable, y cuandot erminas la vuelves a asignar al DataSource de la grilla, para que la nueva informacion

    o sea no puedes hacer un update de una sola celda de forma automatica salvo que tengas detectada la celda y cambies el valor de la propiedad Value de la misma

    pero como en este caso cambias la informacion de los datos que la grilla muestra si la bindeas nuevamente se actualizara

    saludos
    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    jueves, 31 de diciembre de 2009 18:58
  • pero los datos si me llegan al gridview sin volverla a bindear,
    se reflejan sin problema,
    aqui lo que pasa es que cuando cambian los valores en el grid
    no encuentro evento que detecte ese cambio, para poderlas cambiar a negritas
    jueves, 31 de diciembre de 2009 20:07
  • "OMAR OLGUIN" escribió:

    > Tengo ligado mi DataGridView a una tabla dentro del  Dataset
    > y cuando modifica la tabla directamente se modifica mi GridView en automático
    > ahora lo que quiero es detectar en mi GridView cual celda es la que está cambiando

    Hola, Omar:

    Si los datos los modificas directamente en el objeto DataTable llamado "fxo" existentes en un objeto DataSet, el evento que tienes que detectar es el evento ColumnChanging del objeto DataTable, el cual se desencadenará cuando se está modificando un campo del objeto DataTable.

        Private Sub DataTableOnColumnChanging(sender As Object, e As DataColumnChangeEventArgs)

            ' Referenciamos el objeto DataRow que se está modificando.
            '
            Dim row As DataRow = e.Row

            ' Obtenemos el índice del objeto DataRow.
            '
            Dim index As Integer = m_dt.Rows.IndexOf(row)

            Dim negritas As Font = New Font("Tahoma", 8, FontStyle.Bold)

            Dim color As Color = Drawing.Color.Black

            ' Cambiamos el estilo de la celda que se corresponde
            ' con el valor de un campo del objeto DataRow.
            '
            Dg.Rows(index).Cells("TradeId_").Style.Font = negritas
            Dg.Rows(index).Cells("TradeId_").Style.ForeColor = color

        End Sub

    Como se puede observar, en el procedimiento estoy haciendo uso de un campo llamado «m_dt», el cual se encuentra declarado a nivel del formulario de la siguiente manera:

        Private m_dt As DataTable

    En el evento Load del formulario, y una vez que hayas rellenado el objeto DataSet, referenciarías el objeto DataTable de la siguiente manera:

        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

            m_dt = Ds.Tables("fxo")

            ' Enlazamos el control DataGridView con el objeto DataTable
            '
            Dg.DataSource = m_dt

            ' Instalamos el controlador para el evento ColumnChanging
            ' del control DataGridView.
            '
            AddHandler m_dt.ColumnChanging, AddressOf DataTableOnColumnChanging

        End Sub

    Cuando desees modificar un registro, ejecutarías lo que estás ejecutando:

        Dim reg() As DataRow = m_dt.Select("Id = 1")

        reg(0)("TradeDate") = "2009/02/31"

        Reg(0).EndEdit()

    Un saludo


    Enrique Martínez
      [MS MVP - VB]

    viernes, 1 de julio de 2011 21:35
    Moderador
  • Leandro buen dia.

    Necesito hacer el efecto de TextChanged en un TextBox pero en un DataGridViewTextBox. A medida que el usuario cambia el control se vaya desencadenando un evento. Me puedes ayudar por favor?

    Saludos cordiales,

    Jaime


    saludos.

    miércoles, 5 de octubre de 2016 16:39