Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Ecovacs Goat O1200 LiDAR Pro: la prova del robot tagliaerba con tagliabordi integrato
Ecovacs Goat O1200 LiDAR Pro: la prova del robot tagliaerba con tagliabordi integrato
Nuova frontiera per i robot tagliaerba, con Ecovacs GOAT O1200 LiDAR Pro che riconosce l'ambiente in maniera perfetta, grazie a due sensori LiDAR, e dopo la falciatura può anche rifinire il bordo con il tagliabordi a filo integrato
Recensione Samsung Galaxy S26+: sfida l'Ultra, ma ha senso di esistere?
Recensione Samsung Galaxy S26+: sfida l'Ultra, ma ha senso di esistere?
Equilibrio e potenza definiscono il Samsung Galaxy S26+, un flagship che sfida la variante Ultra e la fascia alta del mercato con il primo processore mobile a 2nm. Pur mantenendo l'hardware fotografico precedente, lo smartphone brilla per un display QHD+ da 6,7 pollici d'eccellenza, privo però del trattamento antiriflesso dell'Ultra, e per prestazioni molto elevate. Completano il quadro la ricarica wireless a 20W e, soprattutto, un supporto software settennale
Zeekr X e 7X provate: prezzi, autonomia fino a 615 km e ricarica in 13 minuti
Zeekr X e 7X provate: prezzi, autonomia fino a 615 km e ricarica in 13 minuti
Zeekr sbarca ufficialmente in Italia con tre modelli elettrici premium, X, 7X e 001, distribuiti da Jameel Motors su una rete di 52 punti vendita già attivi. La Zeekr X parte da 39.900 euro, la 7X da 54.100: piattaforma a 800V, chip Snapdragon di ultima generazione, ricarica ultraveloce e un'autonomia dichiarata fino a 615 km WLTP. Le prime consegne sono previste a metà aprile
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 26-05-2009, 11:45   #1
RaouL_BennetH
Senior Member
 
L'Avatar di RaouL_BennetH
 
Iscritto dal: Sep 2004
Messaggi: 3967
[C#/VS2005]Validazione input utente

Ciao a tutti

Fino ad ora, nei miei piccoli progetti winforms, gestivo la validazione dell'input da parte dell'utente gestendo gli eventi per ogni singolo controllo presente sul form, per esempio per controllare che una textbox non venisse lasciata vuota o accettasse solo valori numerici et similia..

Adesso invece vorrei capire come fare per creare una classe apposita che possa gestirmi queste cose indipendentemente dal tipo di oggetto, soprattutto in considerazione del fatto che normalmente, un'applicazione che sia già poco più di un esempio, può contenere decine di forms.

L'ideuzza che ho io sarebbe in pratica:

Input utente -> Validazione

Validazione = ok -> passa i dati sul db x esempio
Validazione = no -> evidenzia il controllo che richiede un input corretto.


Sapreste mettermi sulla buona strada?

grazie mille

RaouL.
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
RaouL_BennetH è offline   Rispondi citando il messaggio o parte di esso
Old 26-05-2009, 12:16   #2
gugoXX
Senior Member
 
L'Avatar di gugoXX
 
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
La strategia che considero migliore e' quella di "impedire" il piu' possibile a priori all'utente di digitare qualcosa di sbagliato.
Per ASP.net e per WPF ci sono dei template anche estendibili per scrivere in fase dichiarativa cosa conterra' l'elemento di input.

Se per esempio nel WebForm di una pagina ASP.net si istanzia una TextBox e si vuole che contenga solo formule, allora potrai usare il filtro dichiarativo per imporre tale comportamento.

Codice:
<asp:TextBox runat="server" ID="TextBox3" />
   <ajaxToolkit:FilteredTextBoxExtender ID="ftbe" runat="server"
    TargetControlID="TextBox3"
    FilterType="Custom, Numbers"
    ValidChars="+-=/*()." />
Analogamente e anche piu' facilmente con WPF, dove il criterio di validazione e' customizzabile in modo decisamente semplice.

Relativamente a WinForm mi ricordo di avere usato una libreria che permetteva un comportamento simile.

Talvolta la fase di validazione dovra comunque essere fatta. Ma direi piu' leggera.
In Winform puoi dichiarare per una form/controllo quello che e' il pulsante di Conferma.
Al premere del pulsante il Framework scatenera' l'evento
Validating
su ciascuno dei componenti visuali della form/controllo
(Quindi tutte le textbox, etc.)

Potrai quindi sottoscriverai questo evento su qualcuno di questi componenti, e il corpo del metodo potra' elevare il fallimento della validazione, cosa che elevera' una Eccezione invece di chiamare il codice del metodo del pulsante di Conferma.

Cosa fare con l'eccezione sta poi a te, come per esempio visualizzare una dialog di errore.

Per quanto riguarda la strategia da adottare per descrivere il codice di validazione dipende dalla natura delle tue validazioni.
Se sono tante e sono tutte simili/uguali ti consiglierei di usare un subclassing dei controlli standard, ovvero di creare dei tuoi controlli con quel paio di validazioni che andrai a pilotare in fase dichiarativa e che potrai estendere con il passare del tempo quando dovessi trovare l'esigenza di nuove validazioni non ancora coperte.
Se invece i controlli da validare sono pochi e le validazioni sono tutte diverse e magari cambiano anche a runtime, ti consiglieri di dare un'occhiata al Decorator Pattern.
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto.
E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test.

Ultima modifica di gugoXX : 26-05-2009 alle 12:19.
gugoXX è offline   Rispondi citando il messaggio o parte di esso
Old 26-05-2009, 13:31   #3
RaouL_BennetH
Senior Member
 
L'Avatar di RaouL_BennetH
 
Iscritto dal: Sep 2004
Messaggi: 3967
Ciao gugoXX

In generale io faccio così:

Parto anche io dal presupposto di cercare di impedire a priori l'inserimento di input non valido anzichè controllarlo successivamente.

per fare questo, solitamente uso l'evento KeyPressEventArgs in modo tale che se l'utente si trova su una casella che accetti solo numeri, non possa neanche per sbaglio inserire una lettera (e quindi se ad esempio ho 20 textbox devo gestire 20 eventi KeyPressEventArgs).

Quello che a me non piace però, è dover gestire appunto un evento per ogni singolo controllo.

Pensavo di generalizzare la validazione almeno per due aspetti:

1) Non lasciare un campo obbligatorio vuoto
2) Avere il focus sull'oggetto dove c'è l'eccezione

Stavo ragionando in questi termini:

Codice:
public class ProvaValidazione
{
     
     private const string emptyFieldMessage = "CAMPO OBBLIGATORIO";
     
     public static bool IsValid(TextBox t)
     {
         if(t.Text.Length != 0)
         {
            SomeErrorProvider.Clear();
            return true;
         }
         else
         {
            SomeErrorProvider.SetError(t, emptyFieldMessage);
            return false;
          }
      }
}
Logicamente però... fa schifo

Infatti se devo validare i dati alla pressione del tasto conferma, se per esempio mi trovassi ad avere 20 textbox, dovrei fare:

Codice:
(if(IsValid(txtCognome) && IsValid(txtNome) && blablabla...
ho vergogna di me stesso.....
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
RaouL_BennetH è offline   Rispondi citando il messaggio o parte di esso
Old 26-05-2009, 13:49   #4
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Se i 20 componenti fossero raccolti in una collezione, basterebbe codificare il controllo di validazione in un ciclo.
__________________

As long as you are basically literate in programming, you should be able to express any logical relationship you understand.
If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it.
(Chris Crawford)
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 26-05-2009, 14:20   #5
RaouL_BennetH
Senior Member
 
L'Avatar di RaouL_BennetH
 
Iscritto dal: Sep 2004
Messaggi: 3967
ciao banryu79

Mmm...

alla fine, diciamo che devo controllare che la lunghezza di alcune stringhe non sia pari a zero.

usando una collezione, potrei fare:

Codice:
List<string> lista = new List<string>();

lista.Add(txtCognome.Text);
lista.Add(txtNome.Text);
lista.Add(comboBoxQualcosa.Text);

...

foreach(string s in lista)
{
   if(s.Length == 0)
   {

         blabla
   }
   else
   {
       ....
   }
}
?


....

però così poi non potrei capire su quale controllo mettere il focus perchè è vuoto.
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek

Ultima modifica di RaouL_BennetH : 26-05-2009 alle 14:29.
RaouL_BennetH è offline   Rispondi citando il messaggio o parte di esso
Old 26-05-2009, 14:39   #6
RaouL_BennetH
Senior Member
 
L'Avatar di RaouL_BennetH
 
Iscritto dal: Sep 2004
Messaggi: 3967
Forse ho trovato:

Codice:
List<Control> controlList = new List<Control>();

controlList.Add(txtCognome);
controlList.Add(comboBoxQualcosa);
controlList.Add(txtNome);

for(int i = 0; i < controlList.Count; ++i)
{
    if(controlList[i].Text.Length == 0)
    {
       SomeErrorProvider.SetError(controlList[i], "errore");
    }
}
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
RaouL_BennetH è offline   Rispondi citando il messaggio o parte di esso
Old 26-05-2009, 15:59   #7
RaouL_BennetH
Senior Member
 
L'Avatar di RaouL_BennetH
 
Iscritto dal: Sep 2004
Messaggi: 3967
mmm.. ho notato una cosa però...

mi basta che uno solo dei campi sia vero ed il controllo si blocca.

Cioè, se sono tutti vuoti, me lo segnala correttamente... se invece ne ho solo uno vuoto, non me lo segnala..
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
RaouL_BennetH è offline   Rispondi citando il messaggio o parte di esso
Old 27-05-2009, 11:46   #8
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Quote:
Originariamente inviato da RaouL_BennetH Guarda i messaggi
mmm.. ho notato una cosa però...

mi basta che uno solo dei campi sia vero ed il controllo si blocca.

Cioè, se sono tutti vuoti, me lo segnala correttamente... se invece ne ho solo uno vuoto, non me lo segnala..
Non è che dipende da come funziona la classe SomeErrorProvider?
Nel codice che hai postato in precedenza si vede che nel caso un controllo sia valido, chiami il metodo Clear; magari dipende da questo.
__________________

As long as you are basically literate in programming, you should be able to express any logical relationship you understand.
If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it.
(Chris Crawford)
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 28-05-2009, 13:13   #9
MarcoGG
Senior Member
 
L'Avatar di MarcoGG
 
Iscritto dal: Dec 2004
Messaggi: 3210
Quote:
Originariamente inviato da RaouL_BennetH Guarda i messaggi
Forse ho trovato:

Codice:
List<Control> controlList = new List<Control>();

controlList.Add(txtCognome);
controlList.Add(comboBoxQualcosa);
controlList.Add(txtNome);

for(int i = 0; i < controlList.Count; ++i)
{
    if(controlList[i].Text.Length == 0)
    {
       SomeErrorProvider.SetError(controlList[i], "errore");
    }
}
Scusa, ma non mi è chiaro lo scopo...
Perchè creare una List ? Non è più semplice un foreach a livello di container ?
Se vuoi restringere i controlli sull'input utente solo ad alcuni controls specifici ci sono anche altre vie, come ad esempio l'uso dei Tag...
MarcoGG è offline   Rispondi citando il messaggio o parte di esso
Old 29-05-2009, 11:20   #10
RaouL_BennetH
Senior Member
 
L'Avatar di RaouL_BennetH
 
Iscritto dal: Sep 2004
Messaggi: 3967
Quote:
Originariamente inviato da MarcoGG Guarda i messaggi
Scusa, ma non mi è chiaro lo scopo...
Perchè creare una List ? Non è più semplice un foreach a livello di container ?
Se vuoi restringere i controlli sull'input utente solo ad alcuni controls specifici ci sono anche altre vie, come ad esempio l'uso dei Tag...
Ciao

Ho pensato ad una lista perchè ho fatto questa considerazione:

In un container potrei avere anche controlli sui quali non devo verificarne il contenuto, perchè magari non sono campi obbligatori. Con una lista a disposizione invece posso decidere appunto quali devono essere verificati.

Di conseguenza, se usassi un foreach sul container, inevitabilmente mi fa il check 'per ogni' controllo presente.

Oltre a questo, dovrei anche andare a specificare cose del tipo:

"se il controllo è un textbox"
"se il controllo è un combobox"

Credo di aver fatto un altro piccolo passo in avanti (spero);

Sia ben chiaro che sono ben accette tutte le critiche e i suggerimenti

Codice:
public class ValidatoreElementare()
{

    public static bool CampiObbligatoriOk(List<Control> controlList, ErrorProvider helper)
    {
            bool fieldsOk = true;
            helper.Clear();
            for (int i = 0; i < controlList.Count; ++i)
            {
                controlList[i].BackColor = Color.White;
                if (controlList[i].Text.Length == 0)
                {
                    helper.SetError(controlList[i], "CAMPO OBBLIGATORIO");
                    controlList[i].BackColor = Color.LightYellow;
                    fieldsOk = false;
                }
             }
             return fieldsOk;
     }

//da un form 

List<Control> ls = new List<Control>();
ls.Add(txtCognome);
ls.Add(txtNome);
ls.Add(cmbProfessione);

return ValidatoreElementare.CampiObbligatoriOk(ls, formErrorProvider);
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
RaouL_BennetH è offline   Rispondi citando il messaggio o parte di esso
Old 29-05-2009, 11:50   #11
MarcoGG
Senior Member
 
L'Avatar di MarcoGG
 
Iscritto dal: Dec 2004
Messaggi: 3210
Quote:
Originariamente inviato da RaouL_BennetH Guarda i messaggi
Ciao

Ho pensato ad una lista perchè ho fatto questa considerazione:

In un container potrei avere anche controlli sui quali non devo verificarne il contenuto, perchè magari non sono campi obbligatori. Con una lista a disposizione invece posso decidere appunto quali devono essere verificati.

Di conseguenza, se usassi un foreach sul container, inevitabilmente mi fa il check 'per ogni' controllo presente.

Oltre a questo, dovrei anche andare a specificare cose del tipo:

"se il controllo è un textbox"
"se il controllo è un combobox"
No, puoi discriminare i controls su cui eseguire il check NotNull da quelli che possono anche essere Null, ad esempio utilizzando la Proprietà Tag dei controlli stessi, senza scomodare List aggiuntive e quant'altro, anche perchè una "List" ce l'hai già, ossia il container Form, inoltre con Control.GetType() sapere che tipo di controllo è.
Esempio : Ho vari controlli, ma solo in quelli che prevedo debbano essere Not Null vado a scrivere nella proprietà Tag = NotNull.

Codice:
            foreach (Control C in this.Controls) {
                if ((string)C.Tag == "NotNull") {
                    if (C.Text == "") {
                        C.BackColor = Color.Red;
                        MessageBox.Show(C.GetType() + " - " + C.Name + " Non può essere vuoto !");
                        //... ecc ...
                        //... ecc ...
                    }
                }
            }
Cioè, secondo me è molto più agile come soluzione...
MarcoGG è offline   Rispondi citando il messaggio o parte di esso
Old 29-05-2009, 12:00   #12
RaouL_BennetH
Senior Member
 
L'Avatar di RaouL_BennetH
 
Iscritto dal: Sep 2004
Messaggi: 3967
Capito

Ragionerò anche sul tuo suggerimento.

Per il momento grazie
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
RaouL_BennetH è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Ecovacs Goat O1200 LiDAR Pro: la prova del robot tagliaerba con tagliabordi integrato Ecovacs Goat O1200 LiDAR Pro: la prova del robot...
Recensione Samsung Galaxy S26+: sfida l'Ultra, ma ha senso di esistere? Recensione Samsung Galaxy S26+: sfida l'Ultra, m...
Zeekr X e 7X provate: prezzi, autonomia fino a 615 km e ricarica in 13 minuti Zeekr X e 7X provate: prezzi, autonomia fino a 6...
Marathon: arriva il Fortnite hardcore Marathon: arriva il Fortnite hardcore
HP Imagine 2026: abbiamo visto HP IQ all’opera, ecco cosa può (e non può) fare HP Imagine 2026: abbiamo visto HP IQ all’opera, ...
Cometa interstellare 3I/ATLAS: l'ESA dif...
Kodak PIXPRO AZ653: la fotocamera bridge...
Monitor da gaming: Samsung si conferma l...
The Duskbloods potrebbe arrivare a fine ...
Il miglior pesce d'aprile del mondo Linu...
Monopattini elettrici a 62 km/h fermati ...
OpenAI porta la modalità vocale d...
Mercedes-Benz introduce lo steer-by-wire...
Hacker agli Uffizi, il museo smentisce: ...
Nvidia mostra il futuro della grafica co...
Windows 11, scattano gli aggiornamenti f...
TIM lancia l'offerta di Pasqua: Giga ill...
Prime foto reali per OPPO Find X9 Ultra:...
Il leak di Claude Code diventa un'esca: ...
Netflix, batosta in Italia: aumenti ille...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 18:39.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v