0

これは私が現在持っているコードです:

private void textBox_KeyPress(object sender, KeyPressEventArgs e)
{
    e.Handled = !char.IsDigit(e.KeyChar) && !char.IsControl(e.KeyChar) && e.KeyChar != '.';
    if (e.KeyChar == '.' && (sender as TextBox).Text.IndexOf('.') > -1) e.Handled = true; 

}
4

4 に答える 4

6

KeyPress は、この種の検証を行うには十分ではありません。これを回避する簡単な方法は、Ctrl+V を使用してテキスト ボックスにテキストを貼り付けることです。またはコンテキストメニュー、キーイベントはまったくありません。

この特定のケースでは、TextChanged イベントがジョブを完了します。

    private void textBox_TextChanged(object sender, EventArgs e) {
        var box = (TextBox)sender;
        if (box.Text.StartsWith(".")) box.Text = "";
    }

しかし、数値の検証にはさらに多くのことがあります。1.1.1 や 1.-2 なども拒否する必要があります。代わりに Validating イベントを使用してください。フォームに ErrorProvider をドロップし、次のようにイベントを実装します。

    private void textBox_Validating(object sender, CancelEventArgs e) {
        var box = (TextBox)sender;
        decimal value;
        if (decimal.TryParse(box.Text, out value)) errorProvider1.SetError(box, "");
        else {
            e.Cancel = true;
            box.SelectAll();
            errorProvider1.SetError(box, "Invalid number");
        }
    }
于 2012-04-20T20:34:35.623 に答える
0

ユーザーは値を貼り付けることができるため、おそらく TextChanged イベントを使用することをお勧めします。.要件を考慮して最高のエクスペリエンスを得るには、先頭の文字を削除することをお勧めします。

void textBox1_TextChanged(object sender, EventArgs e)
{
  if (textBox1.Text.StartsWith("."))
  {
    textBox1.Text = new string(textBox1.Text.SkipWhile(c => c == '.').ToArray());
  }
}

これは、数字のみを使用するという要件に対応していません。その場合、質問では明確ではありませんでした。

于 2012-04-20T20:43:51.013 に答える
0

これは、コピーと貼り付けにも機能します。

    private void textBox1_KeyUp(object sender, KeyEventArgs e)
    {
        int decimalCount=0;
        string rebuildText="";
        for(int i=0; i<textBox1.Text.Length; i++)
        {
            if (textBox1.Text[i] == '.')
            {
                if (i == 0) break;
                if (decimalCount == 0)
                    rebuildText += textBox1.Text[i];
                decimalCount++;
            }
            else if ("0123456789".Contains(textBox1.Text[i]))
                rebuildText += textBox1.Text[i];
        }
        textBox1.Text = rebuildText;    
        textBox1.SelectionStart = textBox1.Text.Length;

    }
于 2012-04-20T21:10:55.400 に答える
0

これを試すことができます:

private void TextBox_TextChanged(object sender, EventArgs e)        
{        
        TextBox.Text = TextBox.Text.TrimStart('.');        
}
于 2013-02-05T21:54:22.787 に答える