将击键顺序转换为价格

时间:2016-05-24 21:17:45

标签: c# winforms

我正在尝试在C#/ Windows窗体项目中设置TextBox,这样当用户使用键盘或小键盘输入价格时,文本框会将输入序列格式化为价。

示例:用户类型1-5-0(减去破折号),文本框的文本值将为$ 1.50。

这是我正在尝试的代码:

private string KeySequence;

// ...

private void TxtValue_KeyPress(object sender, KeyPressEventArgs e)
{
    if(char.IsDigit(e.KeyChar))
    {
        KeySequence += e.KeyChar.ToString();

        if (KeySequence.Length > 0)
        {
            txtValue.Text = "$" + (decimal.Parse(KeySequence) / 100).ToString("0.00");
        }
    }
}

问题是,每当我输入一个值时,第一个字符始终是我输入的最后一个字符,后跟“$”和价格。因此,如果我输入150,则格式化的文本显示为:0$1.50

我原以为这是因为在KeyDown之前调用了KeyPress事件,所以我试图通过处理代码来抑制它:

private void TxtValue_KeyDown(object sender, KeyEventArgs e)
{
    txtValue.Clear();
}

但那仍然没有用。

我能做些什么来阻止第一个角色出现?

2 个答案:

答案 0 :(得分:1)

KeyPress事件之后,控件仍会处理击键。

要防止这种情况,请在事件处理程序中设置e.Handled = true;

答案 1 :(得分:0)

我建议创建一个继承自NumericUpDown的自定义控件。然后,你将拥有一个专门用于处理数字的控件,自动处理小数位数和千位分隔符,提供UP和DOWN控件以便于递增,并且可以附加/前置相应的货币符号。

我正在窃取this answer的格式部分。使用它,您的新课程将类似于:

public class NumericUpDownCurrency : NumericUpDown
{
    public NumericUpDownCurrency()
    {
        DecimalPlaces = 2;
        Increment = 1;
        ThousandsSeparator = true;
    }

    protected override void UpdateEditText()
    {
        ChangingText = true;
        var decimalRegex = new Regex(@"(\d+([.,]\d{1,2})?)");
        var m = decimalRegex.Match(Text);
        if (m.Success)
            Text = m.Value;
        ChangingText = false;
        base.UpdateEditText();
        ChangingText = true;
        Text = Value.ToString("C", CultureInfo.CurrentCulture);
    }
}

将该类添加到项目并构建。然后,您应该在工具箱中看到NumericUpDownCurrency,允许将其放在表单上。控制完成其余的工作。