2009-03-05 17 views

risposta

13

Non dimenticate i seguenti problemi/angolo-casi che si dovranno affrontare se si va verso il basso il percorso proposto:

  • Gli utenti possono utilizzare Ctrl - V o Maiusc - Inserisci per incollare valori "non validi" in (Quella seconda è un po 'più complicata da catturare) ... ma probabilmente gli utenti dovrebbero poter incollare valori legali nel controllo
  • Gli utenti possono fare clic con il tasto destro, incollare valori non validi in usi ng il menu di scelta rapida predefinito
  • Anche se si è tentato di risolvere il problema precedente dando alla casella di testo il proprio menu di scelta rapida, gli utenti possono fare clic con il pulsante destro del mouse fuori dal proprio controllo, tenere premuto il pulsante destro, trascinare sopra la casella di testo e lasciare vai per accedere al menu contestuale di default (e incollare in valori non validi)
  • Qualunque sia l'elaborazione chiave che fate non dovrebbe disabilitare combinazioni di tasti come Alt - F4, ecc (e sì, si romperà questo se si impostare SuppressKeyPress per tutto ciò che non è una cifra valida)
  • Gli utenti dovrebbero probabilmente essere in grado di immettere valori parziali (ad es."-.", come cominciano a digitare "-.23") senza il tuo testo punire loro
  • numeri come "-.1e-2" potrebbe essere considerato legale
  • Un utente potrebbe tenerne immettere un valore che contiene solo cifre, ma che avrebbe traboccare un float
  • Il peggiore di tutti: Qualche altro caso angolo misterioso che gli utenti troveranno dopo aver spedito (!!)

La morale? Può essere molto complicato fare ciò che stai suggerendo.

Probabilmente uno vuole fare una combinazione dei seguenti elementi:

  • utilizzare un controllo che qualcuno che conosce tutti i casi d'angolo costruite (come Microsoft)
  • Fare la convalida di base in caso TextChanged (e fare qualcosa di passivo, come cambiare il colore di testo di sfondo)
  • Salva la convalida fino a quando effettivamente tenta di utilizzare il valore che hanno digitato
  • utilizzare le librerie di sistema per Parse il valore dell'utente per voi
+0

Gah, così tanti casi limite da prendersi cura di te. Odio gli utenti ...;) –

+0

@ecarF: No scherzo; è per questo che è così doloroso costruire davvero un solido controllo di input come richiede l'OP. –

+0

Sì, attendi che l'utente finisca quello che stanno facendo (premi OK), quindi premi il valore con un'espressione regolare e continua o lancia un MessageBox. Molto più bello di ignorare OnKeyPress. – Karl

2

Dai un'occhiata al controllo MaskedTextBox. Inoltre eredita da TextBoxBase e probabilmente ha la funzionalità che stai creando nel tuo.

+0

Grazie per la rapida risposta, Mike. Effettivamente ho ricercato il controllo MaskedTextBox prima di ricorrere al lavoro manuale, tuttavia, non riuscivo a farlo funzionare come volevo fuori dalla scatola con numeri a virgola mobile. Forse ho fatto qualcosa di sciocco, però ... –

+0

Non penso che MaskedTextBox possa fare qualcosa di buono qui, dato che non sembra permettere un numero infinito (definito dall'utente) di carattere. –

0

Non penso che la ruota sia stata ancora inventata (almeno nel framework .NET). Sono sicuro che c'è qualcosa su CodeProject o qualcosa di simile, facendo qualcosa di simile a quello che sei, quindi potrebbe valere la pena di Google.

Il sollevamento pesante non dovrebbe essere troppo pessimo. C'è un po 'di più rispetto a prima vista.

L'esempio eccessivamente semplificato è che si può gestire OnKeyPress, fare un Float.TryParse con il nuovo personaggio aggiunto in Se fosse vero, a mantenere la pressione di un tasto.; se falso, cancellarlo (e.Handled = true).

La parte difficile è cosa fare se eliminano, tagliano o incollano una selezione. L'altra cosa è quando sono appena agli inizi (si potrebbe desiderare di accettare "-" input valido come parziale) ...

+0

http://www.codeproject.com/KB/edit/RegexText.aspx sembra farlo. –

+0

Grazie per il tuo suggerimento, ma non è così semplice. Cosa succede se l'utente cambia la posizione del cursore? Per quanto posso vedere, non puoi accodarti alla cieca. –

+0

Grazie per il link VirualBlackFox. Sicuramente darò un'occhiata. –

0

O controllare per partita utilizzando

void TextBox_KeyUp(object sender, KeyEventArgs e) 
{ 
    if(..) // your condition 
    { 
    e.SuppressKeyPress = false; 
    } 
    else 
    { 
    e.SuppressKeyPress = true; 
    } 
} 

o

void TextBox_KeyUp(object sender, KeyEventArgs e) 
{ 
    e.SuppressKeyPress = CheckInput(e.KeyValue); // where CheckInput is boolean method 
} 
1

E riguardo l'utilizzo di NumericUpDown?

0

ho scoperto la proprietà di un ValidatingType MaskedTextBox:

maskedTextBox1.ValidatingType = typeof(System.Double); 

E in effetti vi dice se è valido o meno. Sfortunatamente, sembra solo convalidare quando i cambiamenti di messa a fuoco (e anche allora in realtà non fa nulla); ma forse c'è un modo per usarlo.

+0

Puoi chiamare il metodo "ValidateText" quando vuoi. Quindi, per allontanarti dalla restrizione del cambiamento dello stato attivo, imposta un gestore per TextChanged e pronuncia se (maskedTextBox1.MaskCompleted) {maskedTextBox1.ValidateText(); } – CJBrew

0

È necessario eseguire la convalida durante l'immissione dei dati oppure è possibile verificare il valore finale immesso una volta che la messa a fuoco è stata persa?

Se quest'ultimo, è anche possibile utilizzare un controllo ErrorProvider per limitare la funzionalità finché l'input non viene risolto.

+0

Grazie, suppongo che avrei dovuto spiegare meglio. Sto convalidando l'input dell'utente durante l'immissione dei dati. –

Problemi correlati