我使用WinForms
遮罩文字框以的格式输入时间hh:mm:ss
。我的遮罩是99:99:99
,我使用right-to-left
输入模式。
问题是,当我键入123
它时,我希望它输入1:23
,但它会这样做:(__:12:3_
所以值是12:3x
,并且它将x替换为下一个键入的值)。
我怎样做才能使它只向左推文本而不是将整个ss
块复制到mm
?
编辑:这是一个澄清:我的客户需要输入以下内容来输入时间值:输入
12[Enter]
12秒
123[Enter]
为1分钟,23秒
1234[Enter]
为12分钟,34秒
12345[Enter]
为1小时23分,45秒,依此类推...
问题在于,当123
在带遮罩的文本框中键入内容时,它将移动12
到minutes
字段,而不是仅移至,而1
仅将3
留在seconds
字段内。
编辑2:正如任何使用蒙版文本框的人都知道的那样,将TextAlign设置为Right不能像您期望的那样工作,就像在任何普通文本编辑器中一样。取而代之的是,它只是将整个蒙版放置在控件的右侧,但是仍然以与TextAligh为Left时相同的方式插入值。
这就是为什么我尝试使用RightToLeft的原因。
您想要的东西似乎几乎是不可能的。除非您键入冒号以显示分隔符,否则maskedtextbox将如何知道您是要输入1位数字还是2位数字应用于您输入的第一个字段?
我认为,对于您似乎想要DateTimePicker
的自定义格式的,效果hh:mm:ss
会更好。输入自动从该hours
字段开始。用户可以输入1位或2位数字,然后冒号和输入将自动移至下一个字段。您还可以选择UpDown按钮,用户可以单击以更改突出显示的字段。
几乎不可能,我的意思是本机行为。通过创建从文本框继承的自定义文本框,您可以执行所需的操作:
public class TimeTextBox : TextBox
{
public TimeTextBox()
{
this.KeyPress += TimeTextBox_KeyPress;
}
public DateTime timeValue = new DateTime();
private void TimeTextBox_KeyPress(object sender, KeyPressEventArgs e)
{
e.Handled = true;
if(char.IsDigit(e.KeyChar))
{
Text += e.KeyChar;
SelectionStart = Text.Length;
}
else
{
MessageBox.Show("Wrong input");
return;
}
FixText();
if(Text.Length > 3 && !DateTime.TryParse(Text, out timeValue))
{
MessageBox.Show("Wrong input");
Text = Text.Remove(Text.Length - 1);
FixText();
timeValue = DateTime.Parse(Text);
}
}
private void FixText()
{
Text = Text.Replace(":", "");
for(int i = Text.Length - 3; i > -1; i -= 2)
{
Text = Text.Insert(i + 1, ":");
SelectionStart = Text.Length;
}
}
}
这将格式化并验证输入,该输入始终从右边开始计数,并且每2个字符插入一个冒号。验证很简单,但尚未在所有情况下都经过测试。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句