Visualizzazione dei risultati da 1 a 10 su 10
  1. #1

    vb.net - gestione tasto Apply e/o rilevamento cambiamenti valori in un form

    Ho creato un form sul quale ho inserito un tasto Applica che alla sua pressione cambia i valori memorizzati in un file ini di configurazione in base ai valori delle textbox e dei campi all'interno del form.

    Funziona tutto però....
    Vorrei che quando viene modificato il valore all'interno di qualsiasi textbox o venga modificato lo stato di qualsiasi checkbox mi riabiliti il tasto "applica".

    Lo so fare rilevando il cambiamento per ogni elemento..ma pensavo ci fosse un sistema per farlo a livello di cambiamento di un "dato","valore" o "settaggio" del form che contine tutti gli elementi... riducendo il codice al minimo.

    Qualcuno mi sa aiutare..!?

    Grazie..(alla fine programmo in VB.net da 7 giorni..con non poche difficoltà)

    Paolo

  2. #2
    Utente di HTML.it L'avatar di gibra
    Registrato dal
    Apr 2008
    residenza
    Italy
    Messaggi
    4,244
    Puoi creare un Handler per tutti i controlli che vuoi catturare, in pratica funziona come il il MultiCast in VB6.
    Ovvero crei una routine per gestire l'evento, ed indirizzi gli eventi dei controlli a questa routine.
    L'importante è che i parametri della routine corrispondano agli stessi parametri degli eventi catturati.

    Esempio:

    codice:
    Private bValoreModificato as Boolean
    
    Private Sub Form_Load()
        btnApply.Enabled = False
        AddHandler TextBox1.TextChanged, AddressOf ValoreModificato
        AddHandler chkProvaCheck.CheckedChanged, AddressOf ValoreModificato
        ' aggiungi gli altri controlli che vuoi 'catturare' 
    End Sub
    
    Private Sub ValoreModificato(ByVal sender As System.Object, ByVal e As System.EventArgs)
            bValoreModificato = True
            btnApply.Enabled = True
    End Sub
    Come vedi, posso catturare eventi diversi, ma se vai a controllare la firma di ogni evento, vedrai che sia TextChanged che CheckedChanged sono uguali, nel senso che hanno gli stesso parametri dello stesso tipo. Se fossero diverse viene generata un'eccezione.


  3. #3
    ok...ora mi metto d'impegno e cerco prima di tradurlo e poi di applicarlo..almeno la teoria c'è..poi la metterò in pratica acquisito il significato della terminologia..
    Son proprio agli inizi.. :+((

    Grazie!!

  4. #4
    Ciao
    Mi permetto di aggiungere che ..... qualora fosse necessario(per esempio i controlli sono tanti) è possibile fare tutto iterando la collezione Controls del Form ed aggiugendo l'Handler al diverso evento in base al Tipo di controllo.

    Esempio ..... nel Load del Form

    codice:
    for each cnt as control in me.controls
    if typeof cnt is textbox then
    addhandler cnt.textchanged, addressof ValoreModificato
    end if
    if typeof cnt is checkbox then
    addhandler cnt.checkedchanged, addressof ValoreModificato
    end if
    next
    Ciao

  5. #5
    Utente di HTML.it L'avatar di gibra
    Registrato dal
    Apr 2008
    residenza
    Italy
    Messaggi
    4,244
    Originariamente inviato da Jeremy75
    codice:
    for each cnt as control in me.controls
    if typeof cnt is textbox then
    addhandler cnt.textchanged, addressof ValoreModificato
    end if
    if typeof cnt is checkbox then
    addhandler cnt.checkedchanged, addressof ValoreModificato
    end if
    next
    Ciao
    Hai provato? Prova, e vedrai che sul checkedchanged ti da errore:

    codice:
    Errore	1	'CheckedChanged' non è un evento di 'System.Windows.Forms.Control'.	
    D:\Documenti\Visual Studio 2008\Projects\test_vari\test_vari\frmMain.vb

  6. #6
    Ciao

    Giusto .... perchè l'evento CheckedChanged non fa parte della classe Control, pertanto, è necessario castare l'oggetto di tipo Control a CheckBox.
    Il codice corretto sarebbe questo.

    codice:
     For Each cnt As Control In Me.Controls
                If TypeOf cnt Is TextBox Then
                    AddHandler cnt.TextChanged, AddressOf ValoreModificato
                End If
                If TypeOf cnt Is CheckBox Then
                    AddHandler DirectCast(cnt, CheckBox).CheckedChanged, AddressOf ValoreModificato
                End If
            Next
    Come è anche vero che, in questo caso, la routine ValoreModificato deve essere modificata in questo modo:

    codice:
     Private Sub ValoreModificato(ByVal sender As Object, ByVal e As EventArgs)
    bValoreModificato = True
            btnApply.Enabled = True
        End Sub

    Grazie per l'osservazione .... ma, come avrai capito, avevo scritto al volo senza aiuto del compilatore

    Ciao

  7. #7

    ottimo

    Perfetto..il primo step fatto e funziona perfettamente..
    ora cercherò di capire come far funzionare nel caso io abbia molti controlli..
    Grazie ancora..

  8. #8
    Utente di HTML.it L'avatar di gibra
    Registrato dal
    Apr 2008
    residenza
    Italy
    Messaggi
    4,244
    Originariamente inviato da Jeremy75
    Come è anche vero che, in questo caso, la routine ValoreModificato deve essere modificata in questo modo:

    codice:
     Private Sub ValoreModificato(ByVal sender As Object, ByVal e As EventArgs)
    bValoreModificato = True
            btnApply.Enabled = True
        End Sub
    Perchè? Funziona benissimo così com'è.

    Originariamente inviato da Jeremy75
    Grazie per l'osservazione .... ma, come avrai capito, avevo scritto al volo senza aiuto del compilatore
    Sì, nessun problema. Ho solo ritenuto che fosse giusto dare l'indicazione corretta.
    Di norma anch'io, quando scrivo al volo, commetto sempre qualche errore.


  9. #9
    Citazione:
    Originariamente inviato da Jeremy75
    Come è anche vero che, in questo caso, la routine ValoreModificato deve essere modificata in questo modo:

    codice: Private Sub ValoreModificato(ByVal sender As Object, ByVal e As EventArgs)
    bValoreModificato = True
    btnApply.Enabled = True
    End Sub

    Perchè? Funziona benissimo così com'è.
    :master: :master:
    Perchè la firma del metodo deve corrispondere con il delegato EventHandler(sender as Object, e as EventArgs) ...... sbaglio ????

  10. #10
    Ooooppps .... che stupido.
    Mi accorgo solo ora che avevo praticamente riscritto il codice che avevi già scritto tu.
    Son proprio fuso .... ora è ufficiale.
    Ciao

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.