none
¿Cuál es la manera idónea de evitar que un evento se ejecute en cadena como en el siguiente ejemplo?

    Pregunta

  • Suponiendo que ModificaLista0, ModificaLista1 y ModificaLista2 son procedimientos que cambian el texto de la lista correspondiente al índice respectivo, al ejecutarse cada uno de ellos se desencadena nuevamente el evento SelectedIndexChanged

    Private Sub ListBox1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ListBox1.SelectedIndexChanged

       Select Case ListBox1.SelectedIndex
          Case 0 : ModificaLista0
          Case 1 : ModificaLista1
          Case 2 : ModificaLista3
       End Select

    End Sub

    La consulta es:

    ¿cómo evito que al ejecutarse ModificaLista0, ModificaLista1 o ModificaLista2 se desencadene nuevamente el evento SelectedIndexChanged?


    • Editado James-2016 domingo, 2 de octubre de 2016 0:37
    domingo, 2 de octubre de 2016 0:36

Respuestas

  • Hola James-2016,

    Solo quieres ejecutar una vez el evento SelectedIndexChanged ?

    Puedes hacer :

       Dim ejecutado As Boolean = True
    
        Private Sub ListBox1_SelectedIndexChanged(sender .....
            If ejecutado Then
                Select Case ListBox1.SelectedIndex
                    Case 0 : ModificaLista0
                    Case 1 : ModificaLista1
                    Case 2 : ModificaLista3
                End Select
    
                'Cambio el valor
                ejecutado = False
            End If
        End Sub

    En este caso entra al IF si el valor de la variable "ejecutado" es True, pero como cambio su valor a False dejaría de entrar.

    Saludos.


    JC NaupaCrispín
    Lima - Perú

    La magia no existe, la programación SI

    • Marcado como respuesta James-2016 domingo, 2 de octubre de 2016 1:44
    domingo, 2 de octubre de 2016 0:43
  • La verdad así había resuelto el problema, con una variable tipo "flag", pensé que quizá había otra manera, de todos modos muchas gracias.

    Hola James-2016,

    Claro es la forma más común, otra forma sería removiendo el evento una vez ejecutado.

    Algo como :

       Private Sub ListBox1_SelectedIndexChanged(sender As Object, e As EventArgs) _
                                            Handles ListBox1.SelectedIndexChanged
    
            Select Case ListBox1.SelectedIndex
                Case 0 : MessageBox.Show("Hola1")
                Case 1 : MessageBox.Show("Hola2")
                Case 2 : MessageBox.Show("Hola3")
            End Select
    
            RemoveHandler TryCast(sender, ListBox).SelectedIndexChanged,
                              AddressOf ListBox1_SelectedIndexChanged
        End Sub

    Saludos.


    JC NaupaCrispín
    Lima - Perú

    La magia no existe, la programación SI

    • Marcado como respuesta James-2016 domingo, 2 de octubre de 2016 1:44
    domingo, 2 de octubre de 2016 0:57

Todas las respuestas

  • Hola James-2016,

    Solo quieres ejecutar una vez el evento SelectedIndexChanged ?

    Puedes hacer :

       Dim ejecutado As Boolean = True
    
        Private Sub ListBox1_SelectedIndexChanged(sender .....
            If ejecutado Then
                Select Case ListBox1.SelectedIndex
                    Case 0 : ModificaLista0
                    Case 1 : ModificaLista1
                    Case 2 : ModificaLista3
                End Select
    
                'Cambio el valor
                ejecutado = False
            End If
        End Sub

    En este caso entra al IF si el valor de la variable "ejecutado" es True, pero como cambio su valor a False dejaría de entrar.

    Saludos.


    JC NaupaCrispín
    Lima - Perú

    La magia no existe, la programación SI

    • Marcado como respuesta James-2016 domingo, 2 de octubre de 2016 1:44
    domingo, 2 de octubre de 2016 0:43
  • La verdad así había resuelto el problema, con una variable tipo "flag", pensé que quizá había otra manera, de todos modos muchas gracias.
    domingo, 2 de octubre de 2016 0:52
  • La verdad así había resuelto el problema, con una variable tipo "flag", pensé que quizá había otra manera, de todos modos muchas gracias.

    Hola James-2016,

    Claro es la forma más común, otra forma sería removiendo el evento una vez ejecutado.

    Algo como :

       Private Sub ListBox1_SelectedIndexChanged(sender As Object, e As EventArgs) _
                                            Handles ListBox1.SelectedIndexChanged
    
            Select Case ListBox1.SelectedIndex
                Case 0 : MessageBox.Show("Hola1")
                Case 1 : MessageBox.Show("Hola2")
                Case 2 : MessageBox.Show("Hola3")
            End Select
    
            RemoveHandler TryCast(sender, ListBox).SelectedIndexChanged,
                              AddressOf ListBox1_SelectedIndexChanged
        End Sub

    Saludos.


    JC NaupaCrispín
    Lima - Perú

    La magia no existe, la programación SI

    • Marcado como respuesta James-2016 domingo, 2 de octubre de 2016 1:44
    domingo, 2 de octubre de 2016 0:57
  • ah, esa no la sabía. 

    ¿Al remover el evento de esa manera ya no habría forma que se ejecute? es decir si selecciono un valor de la lista (desde el programa ejecutado) ya no se volvería a ejecutar, cierto?

    domingo, 2 de octubre de 2016 1:16
  • Hola James-2016,

    Exacto, se ejecutaría la primera vez. Lo que hace el RemoveHandler es quitar la asociación del evento y el control.

    Saludos.


    JC NaupaCrispín
    Lima - Perú

    La magia no existe, la programación SI

    domingo, 2 de octubre de 2016 1:23
  • Ok, gracias.
    domingo, 2 de octubre de 2016 1:44