如何修复c#蒙版文本框从右到左的输入行为?

时间:2014-05-25 22:12:43

标签: c# winforms right-to-left maskedtextbox maskedinput

我使用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的原因。

2 个答案:

答案 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个字符插入冒号。有简单的验证,但尚未针对所有情况进行测试。

相关问题