Controllo personalizzato - Gestione evento Got/Lost Focus

di il
6 risposte

Controllo personalizzato - Gestione evento Got/Lost Focus

Ciao a tutti,
sto creando un controllo personalizzato ed ho la necessità di sapere quando questo controllo perde il focus per attivare alcune sue funzioni.
Per gestire questa cosa ho fatto l'override di OnLostFocus, così:
        protected override void OnLostFocus(EventArgs e)
        {
            MyStuff();
            base.OnLostFocus(e);
        }
Al momento ho due problemi:
- L'evento viene generato solo se, dopo aver selezionato il mio controllo, seleziono un controllo tipo Button ... se il click avviene sulla form, l'evento non viene richiamato.
- Se premo un un controllo tipo Button, l'evento viene generato solo 1 volta, poi non viene più richiamato.

Qualcuno sa aiutarmi?
Grazie per ora e buon anno a tutti,
Claudio aka Dr. Shark.

6 Risposte

  • Re: Controllo personalizzato - Gestione evento Got/Lost Focus

    drshark ha scritto:


    sto creando un controllo personalizzato ed ho la necessità di sapere quando questo controllo perde il focus per attivare alcune sue funzioni.
    [...]
    Al momento ho due problemi:
    - L'evento viene generato solo se, dopo aver selezionato il mio controllo, seleziono un controllo tipo Button ... se il click avviene sulla form, l'evento non viene richiamato.
    - Se premo un un controllo tipo Button, l'evento viene generato solo 1 volta, poi non viene più richiamato.
    Qualcuno sa aiutarmi?
    I problemi che hai descritto in realtà sono il comportamento del tutto naturale del "focus": quando ti sposti su un altro controllo, l'evento viene scatenato poiché il tuo controllo perde il focus; tale evento non si ripresenta più se non dotando di nuovo il controllo del focus e spostandosi ancora su un altro, facendoglielo perdere.

    Forse hai scelto semplicemente l'evento sbagliato da gestire?

    Magari descrivi qual è la funzionalità che stai cercando di implementare, così si può suggerire eventualmente una strada alternativa.

    Ciao!
  • Re: Controllo personalizzato - Gestione evento Got/Lost Focus

    Alka ha scritto:


    I problemi che hai descritto in realtà sono il comportamento del tutto naturale del "focus": quando ti sposti su un altro controllo, l'evento viene scatenato poiché il tuo controllo perde il focus; tale evento non si ripresenta più se non dotando di nuovo il controllo del focus e spostandosi ancora su un altro, facendoglielo perdere.
    Scusa, probabilmente mi sono spiegato male: la prima volta che il mio controllo perde il focus, viene generato l'evento. Tutte le altre volte che perde il focus non viene più generato (e quindi intendo che prima di perderlo, lo ha riacquisito)

    Alka ha scritto:


    Forse hai scelto semplicemente l'evento sbagliato da gestire?
    Bhè, questo non lo escludo e sarebbe anche auspicabile.

    Alka ha scritto:


    Magari descrivi qual è la funzionalità che stai cercando di implementare, così si può suggerire eventualmente una strada alternativa.
    Al momento non ha importanza, ma per fare un esempio, diciamo che il controllo può essere "aperto" e "chiuso", ma quando per il focus deve tornare necessariamente al suo stato "chiuso".

    Spero di essermi spiegato meglio ora. Se così non fosse cercherò di dettagliare maggiormente.
    Grazie per ora e ciao,
    Dr. Shark.
  • Re: Controllo personalizzato - Gestione evento Got/Lost Focus

    drshark ha scritto:


    Spero di essermi spiegato meglio ora. Se così non fosse cercherò di dettagliare maggiormente.
    Grazie per ora e ciao,
    Dr. Shark.
    Si dovresti farci vedere come hai creato il controllo, gli eventi si aggiungono, esistono anche gli eventi Leave e Enter.
    Senza codice è un indovinello
  • Re: Controllo personalizzato - Gestione evento Got/Lost Focus

    Non avevo messo codice perché praticamente non c'è ancora nulla. Vi metto il poco che ho, con cui sto facendo i test (ora sospesi)
    
            public MyControl()
            {
                InitializeComponent();
    
                this.Leave += MyControl_Leave;
                this.Validating += MyControl_Validating;
                MenuWidth = Width;
            }
            
            private void MyControl_Validating(object sender, CancelEventArgs e)
            {
                Console.WriteLine("Validating ...");
            }
    
            private void MyControl_Leave(object sender, EventArgs e)
            {
                Console.WriteLine("Addio esco ...");
            }
            
            protected override void OnLostFocus(EventArgs e)
            {
                Console.WriteLine("Focus perso");
                base.OnLostFocus(e);
            }
    
    Ognuno di questi eventi avviene solo la prima volta che il controllo perde il focus, la seconda volta che perde il focus non succede più nulla.
    Inoltre se il MyControl ha il focus e clicco sulla form, non perde il focus ... devo per forza mettere un altro controllo nella form (tipo un Button) e allora almeno una volta funziona.

    Mi sono fermato subito per questo ... sicuramente sto commettendo qualche sciocchezza di base, ma non riesco a capire quale.

    Dr. Shark
  • Re: Controllo personalizzato - Gestione evento Got/Lost Focus

    Assumo che hai un progetto winform, e hai aggiunto un controllo personalizzato (CustomControl) di nome MyControl.cs
    Una volta che hai costruito il tuo controllo in MyControl, dovrai compilare il progetto e dopo la compilazione entrare in progettazione esempio: Form1.cs(Progettazione).
    Nella casella degli strumenti, troverai il tuo MyControl, che puoi aggiungere al form, una volta aggiunto il controllo MyControl, ne puoi gestire gli eventi.
    Gli eventi Leave e Enter, non sono utilizzabili in un controllo di tipo control di default, per le prime prove ti consiglio di usare MouseEnter e MouseLeave.

    Se vuoi verificare invece direttamente dalla classe scrivendo nella console, prova:
    
            public MyControl()
            {
                InitializeComponent();
                this.MouseLeave += MyControl_Leave;
                this.MouseEnter += MyControl_Enter;
                this.Validating += MyControl_Validating;
            }
    
            private void MyControl_Validating(object sender, CancelEventArgs e)
            {
                Console.WriteLine("Validating ...");
            }
    
            private void MyControl_Leave(object sender, EventArgs e)
            {
                Console.WriteLine("Addio esco ...");
            }
            
            private void MyControl_Enter(object sender, EventArgs e)
            {
                Console.WriteLine("Entro ...");
            }
    
    Per usare l'evelto leave (lostfocus) in un controllo control:
    
      public partial class MyControl : Control
    
    lo dovresti implementare, è meglio usare un controllo che già ce l'ha es:
    
      public partial class MyControl : Button
    
    Il focus o select è per un controllo che è adibito a ricevere un input.
  • Re: Controllo personalizzato - Gestione evento Got/Lost Focus

    drshark ha scritto:


    Non avevo messo codice perché praticamente non c'è ancora nulla. Vi metto il poco che ho, con cui sto facendo i test (ora sospesi)
    Da quale classe eredita il tuo controllo?
Devi accedere o registrarti per scrivere nel forum
6 risposte