![](/img/trans.png)
[英]Asp.net How to limit number of digits before and after the decimal point in textbox keypress event
[英]Tabbing within a textbox - Tab between value before and after decimal point
我是Winform C#的新手。 现在,我面临着极具挑战性的要求,但这对你们来说可能很愚蠢。
你们中的任何一个都可以帮助我提供下面满足我要求的代码。
我在Winform应用程序中有一个十进制值(金额)的文本框。 我一直保持良好的验证等。小数点后仅允许两位数字。 同样,如果用户从上一个控件切换到此文本框,则whoe值(文本框中的小数表示“ 22223.39”将被突出显示)。 都好。
但是,我的业务用户想要的是,如果他从先前的控件切换到此文本框,并假设他们想在上述示例中仅更改小数点后的数字,即“ 39”,则他们希望切换并仅键入,以便仅被新值覆盖,值“ 22223”将保持不变。 他们应该能够前后退缩。
即,简单地说,如果用户在文本框中单击标签,则应首先转到数字字段并突出显示数字(在上面的示例中,应突出显示“ 22223”,然后,如果用户再次按tab,则应转到并突出显示小数点后的数字(在上面的示例39“中)。我不确定如何执行此操作。并且,如果用户再次第三次按下该选项卡,则应移至下一个控件/文本框(常规)。
但是我想到保留2个文本框,这很愚蠢。 我只想在文本框及其C#Winform应用程序中获得与我提到的功能完全相同的功能。
我也不需要数字上落控件,它有一些限制。
正如杰里米·汤普森(Jeremy Thompson)正确说的那样,这是个坏主意,因此您可能应该尝试说服用户使用其他一些更标准的输入法。
就是说,主要是作为查看是否可以进行这项工作的练习,我想到了以下子类化的文本框控件,该控件在每次我想到的试验中都能正常运行。 这包括正确签入和退出文本框,以及向左箭头时再次突出显示小数部分。
主要技巧是IsInputKey
覆盖-其余代码来自于我进行测试的东西。 如果您最终使用了基于此的东西,请进行彻底测试,因为与标准控制功能的任何扭曲一样,它可能会遇到奇怪的情况。
public class TabTextBox : TextBox
{
public bool ready_to_leave = false;
protected override void OnEnter(EventArgs e)
{
this.SelectionStart = 0; // this.Text.IndexOf(".") + 1;
this.SelectionLength = this.Text.IndexOf(".");
}
protected override bool IsInputKey(Keys keyData)
{
if (keyData == Keys.Tab && !ready_to_leave)
{
return true;
}
else
{
return base.IsInputKey(keyData);
}
}
protected override void OnLeave(EventArgs e)
{
ready_to_leave = false;
base.OnLeave(e);
}
protected override void OnKeyPress(KeyPressEventArgs e)
{
if (ready_to_leave)
{
e.Handled = true;
}
base.OnKeyPress(e);
}
protected override void OnKeyDown(KeyEventArgs e)
{
if (e.KeyData == Keys.Tab && !ready_to_leave)
{
this.SelectionStart = this.Text.IndexOf(".") + 1;
this.SelectionLength = 2;
ready_to_leave = true;
e.Handled = true;
}
else
{
base.OnKeyDown(e);
}
}
protected override void OnKeyUp(KeyEventArgs e)
{
if (e.KeyCode == Keys.Left)
{
if (this.SelectionStart - 1 < this.Text.IndexOf("."))
ready_to_leave = false;
}
base.OnKeyUp(e);
}
}
这不是一个好主意,它违反了窗口应用程序的标准操作。
另外,您必须关闭控件上的TabStop并自己执行Tabbing。 我会考虑以上内容与用户交谈,并询问是否按“。”。 足以突出显示小数位。 这是一些代码来演示我建议的解决方案:
private void textBox1_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyValue == 190 && textBox1.Text.IndexOf(".") > 0)
{
textBox1.SelectionStart = textBox1.Text.IndexOf(".") + 1;
textBox1.SelectionLength = 2;
e.SuppressKeyPress = true;
}
}
如果要多个文本框共享此功能,请进入InitializeComponent()并执行以下操作:
this.textBox1.KeyDown += new System.Windows.Forms.KeyEventHandler(this.textBox1_KeyDown);
this.textBox2.KeyDown += new System.Windows.Forms.KeyEventHandler(this.textBox1_KeyDown);
this.textBox3.KeyDown += new System.Windows.Forms.KeyEventHandler(this.textBox1_KeyDown);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.