2

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

4

2 回答 2

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

于 2014-05-25T22:39:09.173 回答
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));
}
于 2014-05-25T22:24:16.697 回答