Txtbox per valori float

mercoledì 06 agosto 2003 - 11.48

giulio_santorini Profilo | Newbie

ciao
vorrei avere un textbox che contenga solo valori numerici con un numero definito di decimali.
In c# .NET non c'è una proprietà per fare ciò?
Potreste consigliarmi un tutorial o un HOWTO?
Grazie!

Brainkiller Profilo | Guru

Ciao Giulio e Benvenuto,
in effetti di base non esiste niente di simile.
Prova all'interno dell'evento OnKeyPress di una Textbox ad incollare il seguente codice:

int max_decimals=3;

if( ( (e.KeyChar < '0') || (e.KeyChar > '9') ) && (e.KeyChar!=8) && (e.KeyChar!=46))
e.Handled = true;
else
{
if (e.KeyChar==46)
{
if (textBox1.Text.IndexOf(".")!=-1)
e.Handled=true;
}
else if (e.KeyChar==8)
{
}
else
{
int pos=textBox1.Text.IndexOf(".");
if (pos!=-1)
{
if (textBox1.Text.Length-pos>max_decimals)
e.Handled=true;
}
}
}

In questo modo in quella textbox potrai solo scrivere numeri, una virgola sottoforma di punto "." e il numero di decimali specificato dalla variabile max_decimals!
Provala e fammi sapere.
Ciao

David De Giacomi

giulio_santorini Profilo | Newbie

ciao David,
grazie del benvenuto e grazie della tua proposta di soluzione!
Avevo visto qualcosa di simile, ma non avevo avuto lo spunto di gestire lì oltre il filtro anche la formattazione!

Ho fatto 1 piccola modifica per l'inserimento di un numero di caratteri interi. E un controllo quando lascio il textbox per vedere se il valore è dentro i limiti stabiliti.

Niente di particolare ma li riporto lo stesso:

private void textBox1_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e)
{
int max_decimals = 3;
int max_int = 3;
// se il carattere non è un numero
// eliminalo
if( ( (e.KeyChar < '0') || (e.KeyChar > '9') ) && (e.KeyChar!=8) && (e.KeyChar!=44))
{
e.Handled = true;
}
// altrimenti
else
{
// se è un separatore di decimali...
if (e.KeyChar==44)
{
// se è già inserito evito il nuovo inserimento
if (textBox1.Text.IndexOf(",") != -1)
e.Handled=true;
}
// carattere backspace
else if (e.KeyChar==8)
{
}
// caratteri generici
else
{
// memorizzo lunghezza del testo
int len = textBox1.Text.Length;
// memorizzo posizione del separatore decimale
int pos = textBox1.Text.IndexOf(",");
// se il separatore decimale non esiste
if (pos == -1)
{
// se la lunghezza della stringa supera il limite
// annullo l'inserimento del nuovo carattere
if (len >= max_int)
{
e.Handled = true;
}
}
// altrimenti se il separatore decimale esiste
else
{
// se la posizione supera il terzo carattere la annullo
if (pos > max_int)
{
e.Handled = true;
}
}


if (pos != -1)
{
if (textBox1.Text.Length - pos >max_decimals)
e.Handled=true;
}
}
}
}

private void textBox1_Leave(object sender, System.EventArgs e)
{
if(float.Parse(this.textBox1.Text) > 100.008f)
{
MessageBox.Show("Il valore è maggiore del limite!");
this.textBox1.Focus();
}
}

In pratica funziona, e anche il piccolo concetto che stà dietro al controllo che ho aggiunto dovrebbe filare.

L'unica cosa è l'estetica :-)
Potrò costruirò un metodo (purtroppo di questi maledetti textbox statici ne ho davvero tantissimi da gestire) per il filtro input... ma per il limite devo fare un lungo taglia incolla. :-0

Peccato non ci siano soluzioni più eleganti! :-\
Diceci delle regular expression. Io qualcosa ho scritto per gestirne una che fà a caso mio, ma poi non saprei come integrarla! Nel keypress se caricavo il valore attuale del textbox mi sembra non avevo un valore aggiornato... ma a parte questo si tratta di gestire nuovamente gli eventi di ogni controllo.

Mah per ora penso lascerò cosi! :-)
Grazie!

giulio_santorini Profilo | Newbie

credo che il mio "add on" per limitare anche i numeri interi a 3 caratteri non funziona bene! :-)
Adesso lo ho guardato con attenzione e me ne sono accorto!

Secondo tè è possibile controllare il numero sia di decimali che di interi? Si sà solo dove è la virgola non dove è stato inserito il carattere quindi come faccio a sapere se il carattere supera o meno il limite dei caratteri (decimali o interi)?

Grazie del tuo parere!!!
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5