繁体   English   中英

如何解决C#蒙版文本框从右到左的输入行为?

[英]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:ssDateTimePicker ,它会更好。 输入自动从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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM