[英]How can I fix c# masked textbox right-to-left input behaviour?
我使用WinForms
屏蔽的文本框以hh:mm:ss
的格式输入时间。 我的屏蔽是99:99:99
,我使用right-to-left
输入模式。
问题是,当我在其中输入123
时,我希望它输入1:23
,但是它执行以下操作: __:12:3_
(因此该值为12:3x
,并且它将x替换为下一个值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的原因。
您可以使用一个简单的文本框并按照此逻辑将字符串断开。 我仅向您展示了几分钟和几秒钟,您可以将其扩展到遵循代码的几小时。
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));
}
您想要的东西似乎几乎是不可能的。 除非您输入冒号以显示分隔符,否则maskedtextbox将如何知道您是要输入1位数字还是2位数字应用于您输入的第一个字段?
我认为,对于您似乎想要具有自定义格式hh:mm:ss
的DateTimePicker
,它会更好。 输入自动从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个字符插入一个冒号。 验证很简单,但尚未在所有情况下都经过测试。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.