none
Problemas con bindingsource RRS feed

  • Pregunta

  • Al enlazar un dataview a un bindingsource.datasource se lanza el evento CurrenChanged del bindingsource tres veces y no entiendo porqué.

    ¿Alguien puede ayudarme?
    miércoles, 3 de febrero de 2010 18:01

Respuestas

  • ¿Ayudarte? ¿En qué quieres que te ayudemos?

    Si el evento CurrentChanged del control BindingSource se desencadena tres veces, ¿qué quieres que le hagamos? ¿Le damos una paliza para que no se desencadene tres veces? :-))

    La explicación de que ello suceda te la podrían dar los desarrolladores de dicho control, pero nosotros tenemos que adaptarnos a lo que hay.

    Por ejemplo, si sólo deseas que el código fuente existente en dicho evento únicamente se ejecute cuando ya se haya ejecutado dos veces, podrías hacer lo siguiente:

       Private Sub BindingSource1_CurrentChanged( _
            ByVal sender As Object, ByVal e As EventArgs) _
            Handles BindingSource1.CurrentChanged

            Static n As Integer

            Try
                n += 1

                ' Si no es la tercera vez, abandonamos el procedimiento
                '
                If n < 3 Then Return

                ' Escribir aquí el código que únicamente deseas ejecutar
                ' cuando ya se haya desencadenado el evento dos veces.
                '
                MessageBox.Show("Es la tercera o más veces que se ejecuta.")

            Catch ex As OverflowException

                ' Atrapar la hipotética excepción que se puede procudir
                ' por desbordamiento en el valor de la variable.
                '
                n = 2

            End Try

    Un saludo


    Enrique Martínez [MS MVP - VB]
    jueves, 4 de febrero de 2010 11:39
    Moderador
  • Hola, Lluís:

    Más que a los métodos BeginLoadData y EndLoadData del objeto DataTable, yo se lo achacaría a la propiedad DataSource del control BindingSource, que Dios sepa lo que hará para que se desencadene 2 ó 3 (dependiendo de las circunstancias que se presenten en el origen de datos) el método OnCurrentChanged, que en definitiva es el que invoca al evento CurrentChanged del control.

    Esto se demuestra fácil si creamos una clase que herede del control BindingSource:

    Public Class BindingSourceEx

        Inherits BindingSource

        Protected Overrides Sub OnCurrentChanged(ByVal e As System.EventArgs)
            MyBase.OnCurrentChanged(e)
        End Sub

        Public Overloads Property DataSource() As Object
            Get
                Return MyBase.DataSource
            End Get
            Set(ByVal value As Object)

                MessageBox.Show("Se ha establecido el valor de la propiedad DataSource.")

               ' MyBase.DataSource = value

            End Set
        End Property

    End Class

    Como podrás observar, tengo comentada la asignación de la propiedad DataSource en la clase base, de ahí que no se desencadene el evento CurrentChanged, aunque el objeto DataTable tenga o no datos. Pero si quitas el comentario, observarás que al asignar el valor de la propiedad DataSource de la clase base, se ejecutará el método OnCurrentChanged y posteriormente el evento CurrentChanged en el formulario donde tengamos insertado el control BindingSourceEx.

    Digo que el evento CurrentChanged se desencadenará 3 ó 2 veces, porque dependerá si el origen de datos (un objeto DataTable por ejemplo) tiene o no datos, respectivamente, cuando se asigne la propiedad DataSource del control.

    Por ejemplo, creamos el objeto DataTable, pero éste no tiene datos:

            Dim dt As New DataTable

            BindingSource1.DataSource = dt

    En éste supuesto, el evento CurrentChanged se desencadenará 2 veces.

    Pero si creamos el objeto DataTable, lo rellenamos de datos (con independencia que hagamos uso de los métodos BeginLoadData y EndLoadData del objeto DataTable), y por último se lo asignamos a la propiedad DataSource del control BindingSource, en éste caso se desencadenará 3 veces: las dos primeras veces por los motivos explicados anteriormente, y una tercera más porque se está seleccionando un primer registro, por tanto, se está cambiando el elemento enlazado en ese preciso momento, que es cuando se desencadena el evento CurrentChanged.

    Posteriormente, únicamente se desencadenará una sola vez, que será cuando se cambie de registro.

    Por tanto, digamos que el evento CurrentChanged del control BindingSource sólo se desencadena 2 veces cuando se asigna el valor de su propiedad DataSource. La tercera, digamos que es producto de la ejecución normal del código existente en el control. :-)

    Un saludo, Lluís.

     


    Enrique Martínez [MS MVP - VB]
    jueves, 4 de febrero de 2010 12:48
    Moderador

Todas las respuestas

  • ¿Ayudarte? ¿En qué quieres que te ayudemos?

    Si el evento CurrentChanged del control BindingSource se desencadena tres veces, ¿qué quieres que le hagamos? ¿Le damos una paliza para que no se desencadene tres veces? :-))

    La explicación de que ello suceda te la podrían dar los desarrolladores de dicho control, pero nosotros tenemos que adaptarnos a lo que hay.

    Por ejemplo, si sólo deseas que el código fuente existente en dicho evento únicamente se ejecute cuando ya se haya ejecutado dos veces, podrías hacer lo siguiente:

       Private Sub BindingSource1_CurrentChanged( _
            ByVal sender As Object, ByVal e As EventArgs) _
            Handles BindingSource1.CurrentChanged

            Static n As Integer

            Try
                n += 1

                ' Si no es la tercera vez, abandonamos el procedimiento
                '
                If n < 3 Then Return

                ' Escribir aquí el código que únicamente deseas ejecutar
                ' cuando ya se haya desencadenado el evento dos veces.
                '
                MessageBox.Show("Es la tercera o más veces que se ejecuta.")

            Catch ex As OverflowException

                ' Atrapar la hipotética excepción que se puede procudir
                ' por desbordamiento en el valor de la variable.
                '
                n = 2

            End Try

    Un saludo


    Enrique Martínez [MS MVP - VB]
    jueves, 4 de febrero de 2010 11:39
    Moderador
  • :-)
    Hola,

    En este hilo encontrarás la respuesta:
    http://social.msdn.microsoft.com/forums/en-US/winformsdatacontrols/thread/5f968c71-a979-4e80-9896-94736e832f0c/

    Aunque suscribo lo de Enrique sobre darle una paliza ;-)
    Saludos,

    No olvides marcar la respuesta como correcta si te ha sido de utilidad :-)

    [MS-MVP-MCTS]

    Mi Perfil MVP en: https://mvp.support.microsoft.com/profile/Lluis
    NUG: http://andorradotnet.com
    Web: http://www.ordeeno.com
    Blog: http://msmvps.com/blogs/lfranco
    Geeks: http://geeks.ms/blogs/lfranco

    jueves, 4 de febrero de 2010 11:52
    Moderador
  • Hola, Lluís:

    Más que a los métodos BeginLoadData y EndLoadData del objeto DataTable, yo se lo achacaría a la propiedad DataSource del control BindingSource, que Dios sepa lo que hará para que se desencadene 2 ó 3 (dependiendo de las circunstancias que se presenten en el origen de datos) el método OnCurrentChanged, que en definitiva es el que invoca al evento CurrentChanged del control.

    Esto se demuestra fácil si creamos una clase que herede del control BindingSource:

    Public Class BindingSourceEx

        Inherits BindingSource

        Protected Overrides Sub OnCurrentChanged(ByVal e As System.EventArgs)
            MyBase.OnCurrentChanged(e)
        End Sub

        Public Overloads Property DataSource() As Object
            Get
                Return MyBase.DataSource
            End Get
            Set(ByVal value As Object)

                MessageBox.Show("Se ha establecido el valor de la propiedad DataSource.")

               ' MyBase.DataSource = value

            End Set
        End Property

    End Class

    Como podrás observar, tengo comentada la asignación de la propiedad DataSource en la clase base, de ahí que no se desencadene el evento CurrentChanged, aunque el objeto DataTable tenga o no datos. Pero si quitas el comentario, observarás que al asignar el valor de la propiedad DataSource de la clase base, se ejecutará el método OnCurrentChanged y posteriormente el evento CurrentChanged en el formulario donde tengamos insertado el control BindingSourceEx.

    Digo que el evento CurrentChanged se desencadenará 3 ó 2 veces, porque dependerá si el origen de datos (un objeto DataTable por ejemplo) tiene o no datos, respectivamente, cuando se asigne la propiedad DataSource del control.

    Por ejemplo, creamos el objeto DataTable, pero éste no tiene datos:

            Dim dt As New DataTable

            BindingSource1.DataSource = dt

    En éste supuesto, el evento CurrentChanged se desencadenará 2 veces.

    Pero si creamos el objeto DataTable, lo rellenamos de datos (con independencia que hagamos uso de los métodos BeginLoadData y EndLoadData del objeto DataTable), y por último se lo asignamos a la propiedad DataSource del control BindingSource, en éste caso se desencadenará 3 veces: las dos primeras veces por los motivos explicados anteriormente, y una tercera más porque se está seleccionando un primer registro, por tanto, se está cambiando el elemento enlazado en ese preciso momento, que es cuando se desencadena el evento CurrentChanged.

    Posteriormente, únicamente se desencadenará una sola vez, que será cuando se cambie de registro.

    Por tanto, digamos que el evento CurrentChanged del control BindingSource sólo se desencadena 2 veces cuando se asigna el valor de su propiedad DataSource. La tercera, digamos que es producto de la ejecución normal del código existente en el control. :-)

    Un saludo, Lluís.

     


    Enrique Martínez [MS MVP - VB]
    jueves, 4 de febrero de 2010 12:48
    Moderador
  • Muchas gracias vuestra ayuda me ha sido muy útil.
    viernes, 5 de febrero de 2010 9:51
  • :-)
    Jope... Hoy te has levantado con energía eh?

    Buena observación Enrique. Por cierto te veré en el MVP Open Day? Porque hace una jartá que no vienes...
    Saludos,

    No olvides marcar la respuesta como correcta si te ha sido de utilidad :-)

    [MS-MVP-MCTS]

    Mi Perfil MVP en: https://mvp.support.microsoft.com/profile/Lluis
    NUG: http://andorradotnet.com
    Web: http://www.ordeeno.com
    Blog: http://msmvps.com/blogs/lfranco
    Geeks: http://geeks.ms/blogs/lfranco

    viernes, 5 de febrero de 2010 10:14
    Moderador
  • Pues quiero ir al Open Day, aunque todavía no lo puedo afirmar con seguridad, pero intentaremos que así sea. :-)


    Enrique Martínez [MS MVP - VB]
    viernes, 5 de febrero de 2010 14:06
    Moderador