我使用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
{1}}保留在seconds
字段内。
编辑2:任何使用过屏蔽文本框的人都知道,将TextAlign设置为Right并不会像您预期的那样工作,就像在任何正常情况下一样文本编辑器。相反,它只是将整个蒙版放在控件的右侧,但仍然以与TextAligh为左时相同的方式插入值。
这就是我尝试使用RightToLeft的原因。
答案 0 :(得分:0)
您可以使用简单的文本框并按照此逻辑中断字符串。我只向您展示了几分钟和几秒钟,您可以将其延长到代码后的几个小时。
int seconds, minutes;
if (textBox1.Text.Length == 1 || textBox1.Text.Length == 2)
{
seconds = int.Parse(textBox1.Text);
}
else if (textBox1.Text.Length == 3)
{
seconds = int.Parse(textBox1.Text.Substring(1, 2));
minutes = int.Parse(textBox1.Text.Substring(0, 1));
}
else if (textbox1.Text.Length == 4)
{
seconds = int.Parse(textBox1.Text.Substring(2, 2));
minutes = int.Parse(textBox1.Text.Substring(0, 2));
}
答案 1 :(得分:0)
你想要什么似乎几乎是不可能的。 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个字符插入冒号。有简单的验证,但尚未针对所有情况进行测试。