Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Polestar 3 Performance, test drive: comodità e potenza possono convivere
Polestar 3 Performance, test drive: comodità e potenza possono convivere
Abbiamo passato diversi giorni alla guida di Polestar 3, usata in tutti i contesti. Come auto di tutti i giorni è comodissima, ma se si libera tutta la potenza è stupefacente
Qualcomm Snapdragon X2 Elite: l'architettura del SoC per i notebook del 2026
Qualcomm Snapdragon X2 Elite: l'architettura del SoC per i notebook del 2026
In occasione del proprio Architecture Deep Dive 2025 Qualcomm ha mostrato in dettaglio l'architettura della propria prossima generazione di SoC destinati ai notebook Windows for ARM di prossima generazione. Snapdragon X2 Elite si candida, con sistemi in commercio nella prima metà del 2026, a portare nuove soluzioni nel mondo dei notebook sottili con grande autonomia
Recensione DJI Mini 5 Pro: il drone C0 ultra-leggero con sensore da 1 pollice
Recensione DJI Mini 5 Pro: il drone C0 ultra-leggero con sensore da 1 pollice
DJI Mini 5 Pro porta nella serie Mini il primo sensore CMOS da 1 pollice, unendo qualità d'immagine professionale alla portabilità estrema tipica di tutti i prodotti della famiglia. È un drone C0, quindi in un peso estremamente contenuto e che non richiede patentino, propone un gimbal rotabile a 225 gradi, rilevamento ostacoli anche notturno e autonomia fino a 36 minuti. Caratteristiche che rendono il nuovo drone un riferimento per creator e appassionati
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 26-05-2009, 12: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, 13: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 13:19.
gugoXX è offline   Rispondi citando il messaggio o parte di esso
Old 26-05-2009, 14: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, 14: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, 15: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 15:29.
RaouL_BennetH è offline   Rispondi citando il messaggio o parte di esso
Old 26-05-2009, 15: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, 16: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, 12: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, 14: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, 12: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, 12: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, 13: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


Polestar 3 Performance, test drive: comodità e potenza possono convivere Polestar 3 Performance, test drive: comodit&agra...
Qualcomm Snapdragon X2 Elite: l'architettura del SoC per i notebook del 2026 Qualcomm Snapdragon X2 Elite: l'architettura del...
Recensione DJI Mini 5 Pro: il drone C0 ultra-leggero con sensore da 1 pollice Recensione DJI Mini 5 Pro: il drone C0 ultra-leg...
ASUS Expertbook PM3: il notebook robusto per le aziende ASUS Expertbook PM3: il notebook robusto per le ...
Test ride con Gowow Ori: elettrico e off-road vanno incredibilmente d'accordo Test ride con Gowow Ori: elettrico e off-road va...
Narwal Freo Z10 Ultra: il robot con moci...
In 3 minuti le vedete tutte: sono le mig...
Black Friday da record per Tineco: le sc...
La nuova PS5 con Fortnite manda in tilt ...
Amazon, i tagli hanno colpito soprattutt...
Pazzesco: Panasonic Lumix DC-GH5M2E a 79...
Ecco tutte le offerte Black Friday pi&ug...
DJI Neo a 169€, Flip Combo a 309€ e molt...
Quattro persone arrestate negli USA per ...
Kindle Paperwhite Signature Edition, Col...
Boom di vendite per Kindle e Fire TV Sti...
iPhone 17 Pro, il più desiderato,...
Nuovo record, 849€ per i MacBook Air con...
Wi-Fi 8 secondo Intel: la nuova era del ...
MediaWorld e il caso degli iPad Air vend...
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: 11:17.


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