Domanda

Sono un programmatore MFC che è nuovo in C# e sto cercando un controllo semplice che consenta l'immissione di numeri e la convalida dell'intervallo.

È stato utile?

Soluzione

Guarda il controllo "NumericUpDown".Ha la convalida dell'intervallo, l'input sarà sempre numerico e ha quegli eleganti pulsanti di incremento/decremento.

Altri suggerimenti

Ho dovuto implementare un controllo che accettasse solo numeri, interi o reali.Costruisco il controllo come specializzazione di (leggi:derivato da) controllo TextBox e utilizzo del controllo di input e di un'espressione regolare per la convalida.Aggiungere la convalida dell'intervallo è terribilmente semplice.

Questo è il codice per costruire la regex._numericSeparation è una stringa con caratteri accettati come valori di virgola decimale (ad esempio, a '.' o a ',':$ 10,50 10,50 €

private string ComputeRegexPattern()
{
   StringBuilder builder = new StringBuilder();
   if (this._forcePositives)
   {
       builder.Append("([+]|[-])?");
   }
   builder.Append(@"[\d]*((");
   if (!this._useIntegers)
   {
       for (int i = 0; i < this._numericSeparator.Length; i++)
       {
           builder.Append("[").Append(this._numericSeparator[i]).Append("]");
           if ((this._numericSeparator.Length > 0) && (i != (this._numericSeparator.Length - 1)))
           {
               builder.Append("|");
           }
       }
   }
   builder.Append(@")[\d]*)?");
   return builder.ToString();
}

L'espressione regolare corrisponde a qualsiasi numero (ad es.qualsiasi stringa con caratteri numerici) con un solo carattere come separazione numerica e un carattere opzionale "+" o "-" all'inizio della stringa.Una volta creata la regex (quando si istanzia il controllo), si controlla se il valore è corretto sovrascrivendo il metodo OnValidating.CheckValidNumber() applica semplicemente la Regex al testo introdotto.Se la corrispondenza dell'espressione regolare fallisce, attiva un provider di errori con un errore specificato (impostato con la proprietà pubblica ValidationError) e genera un evento ValidationError.Qui puoi fare la verifica per sapere se il numero rientra nell'intervallo richiesto.

private bool CheckValidNumber()
{
   if (Regex.Match(this.Text, this.RegexPattern).Value != this.Text)
   {
       this._errorProvider.SetError(this, this.ValidationError);
       return false;
   }
   this._errorProvider.Clear();
   return true;
}

protected override void OnValidating(CancelEventArgs e)
{
   bool flag = this.CheckValidNumber();
   if (!flag)
   {
      e.Cancel = true;
      this.Text = "0";
   }
   base.OnValidating(e);
   if (!flag)
   {
      this.ValidationFail(this, EventArgs.Empty);
   }
}

Come ho detto, impedisco anche all'utente di inserire nella casella di testo dati diversi dai caratteri numerici sovrascrivendo il metodo OnKeyPress:

protected override void OnKeyPress(KeyPressEventArgs e)
{
    if ((!char.IsDigit(e.KeyChar) && !char.IsControl(e.KeyChar)) && (!this._numberSymbols.Contains(e.KeyChar.ToString()) && !this._numericSeparator.Contains(e.KeyChar.ToString())))
    {
        e.Handled = true;
    }
    if (this._numberSymbols.Contains(e.KeyChar.ToString()) && !this._forcePositives)
    {
        e.Handled = true;
    }
    if (this._numericSeparator.Contains(e.KeyChar.ToString()) && this._useIntegers)
    {
        e.Handled = true;
    }
    base.OnKeyPress(e);
}

Il tocco elegante:Controllo se il numero è valido ogni volta che l'utente rilascia un tasto, in modo che l'utente possa ricevere feedback mentre digita.(Ma ricorda che devi stare attento con l'evento ValidationFail ;))

protected override void OnKeyUp(KeyEventArgs e)
{
    this.CheckValidNumber();
    base.OnKeyUp(e);
}

È possibile utilizzare una casella di testo normale e un controllo Validator per controllare l'input.

Prova a utilizzare un controllo del provider di errori per convalidare la casella di testo.Puoi utilizzare int.TryParse() o double.TryParse() per verificare se è numerico e quindi convalidare l'intervallo.

È possibile utilizzare una combinazione di RequiredFieldValidator e CompareValidator (impostato su DataTypeCheck per l'operatore e Type impostato su Integer)

Se lo desideri, lo otterrai con una normale casella di testo, altrimenti la raccomandazione sopra è buona.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top