none
CAmbios en algun campo de un form RRS feed

  • Pregunta

  • Hola amigos.

    Sabéis si existe algún evento que me diga si se ha hecho algún cambio en alguno de los textbox de un form enlazados a una tabla.

    Es para activar un boton "ACEPTAR CAMBIOS" que grabe los cambios en la base de datos.

    Necesito saber si el usuario ha cambiado algo, pero me gustaría no tener que consultar uno a uno todos los textbox

    Gracias

    miércoles, 29 de julio de 2015 7:49

Respuestas

Todas las respuestas

  • Lo que puedes hacer es asociar a todos los textbox del formulario un controlador para el evento TextChanged que actualice un flag que te indique si ha habido cambios:

        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            For Each textControl As TextBox In Controls.Cast(Of Control).Where(Function(c) TypeOf c Is TextBox)
                AddHandler textControl.TextChanged, AddressOf TextBox_TextChanged
            Next
        End Sub
    
        Private Sub TextBox_TextChanged(sender As Object, e As EventArgs)
            HasBeenChanged = True
        End Sub
    
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            If HasBeenChanged AndAlso _
                MessageBox.Show("¿Desea guardar los cambios?", "Guardar cambios", MessageBoxButtons.YesNo) = Windows.Forms.DialogResult.Yes Then
                ' Guardar cambios
                HasBeenChanged = False
            End If
        End Sub


    Píldoras .NET
    Artículos, tutoriales y ejemplos de código .NET

    Píldoras JS
    Artículos, tutoriales y ejemplos de código JavaScript, HTML5, CSS3, ...

    • Marcado como respuesta JotaQ miércoles, 29 de julio de 2015 9:26
    • Desmarcado como respuesta JotaQ miércoles, 29 de julio de 2015 11:05
    • Propuesto como respuesta Christian AmadoMVP miércoles, 29 de julio de 2015 14:20
    miércoles, 29 de julio de 2015 8:01
  • Asier... Muchas gracias. Perfecto! eres un máquina!


    miércoles, 29 de julio de 2015 9:30
  • Asier... tengo otro problema

    Resulta que cuando cambio de registro se activa el evento!!

    es decir cuando hago movenext el sistema entiende que el textbox ha cambiado y se lanza el evento... no sé si me explico

    miércoles, 29 de julio de 2015 11:14
  • Sí, lógicamente. Cada vez que se cambia el valor se activa el elemento y por tanto el flag de cambios. Pero cuando sean cambios realizados por ti puedes indicarlo desactivando el flag a continuación.

    Es decir, después de hacer el movenext:

    HasBeenChanged = False
    
    De esta forma con la variable HasBeenChanged controlas si se ha realizado alguna modificación a partir de ese momento.

    Píldoras .NET
    Artículos, tutoriales y ejemplos de código .NET

    Píldoras JS
    Artículos, tutoriales y ejemplos de código JavaScript, HTML5, CSS3, ...

    miércoles, 29 de julio de 2015 13:38
  • Gracias de nuevo Asier. Puedo hacer esto último que me dices pero hay una pega. Ten en cuenta que todo esto se monta para activar o desactivar un botón "aceptar cambios" que solo debe estar enabled cuando el usuario ha modificado o eliminado o añadido un registro. 

    Entonces el problema viene aquí. Imagina que estamos en el registro 1 y el usuario modifica algo -> hasBeenChanged = True. El boton "aceptar cambios" se activa. Ahora el usuario hace moveNext SIN haber hecho click e aceptar cambios. el boton se desactiva, hasBeenChanged=False. 
    REsultado: NO hemos salvado y el botón se ha desactivado y hemos puesto el hasBeenChanged a False...

    miércoles, 29 de julio de 2015 15:29
  • Lo que tendrías que hacer en el botón MoveNext es comprobar si ha habido modificaciones y preguntar al usuario si desea continuar teniendo en cuenta que las modificaciones se perderán:

        Private Sub btnMoveNext_Click(sender As Object, e As EventArgs) Handles btnMoveNext.Click
            If hasBeenChanged AndAlso _
                MessageBox.Show("Los cambios realizados en el registro se perderán. ¿Desea continuar?", "Modificaciones realizadas", MessageBoxButtons.YesNo) = DialogResult.No Then
                Exit Sub
            End If
    
            ' Código para cargar siguiente registro
    
            hasBeenChanged = False
        End Sub
    


    Píldoras .NET
    Artículos, tutoriales y ejemplos de código .NET

    Píldoras JS
    Artículos, tutoriales y ejemplos de código JavaScript, HTML5, CSS3, ...

    miércoles, 29 de julio de 2015 16:46
  • Gracias Asier. Veo que no hay otra manera salvo esta que me dices. 

    Tendría que haber una forma de controlar que se cambian los datos independientemente de que te muevas por los registros. Quiero decir, saber que se ha modificado algo que va a diferir de los datos cargados inicialmente, porque cuando te mueves por los registros sin cambiar nada NO hay modificaciones que hacer.

    Un saludo

    jueves, 30 de julio de 2015 11:03
  • Hola.
    Porque no comparas los valores de los TextBoxs con los de las celdas del DataGridView o donde esten los valores originales

    Un saludo desde Bilbo
    Carlos

    jueves, 30 de julio de 2015 11:42