我正在尝试在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();
}
但那仍然没有用。
我能做些什么来阻止第一个角色出现?
答案 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
,允许将其放在表单上。控制完成其余的工作。