如何在TextBox中编写时自动添加点

时间:2014-04-11 11:26:25

标签: c# wpf xaml

我在TextBox类型上有一个DateTime绑定。我需要在前2个字符和后2个字符后得到一个点,例如:12.12.1990。 我在TextChanged事件中使用了该代码:

void tb_TextChanged(object sender, TextChangedEventArgs e)
{
    int i = tb.SelectionStart;
    if (i == 2 || i == 5)
    {                
        tb.Text += ".";
        tb.SelectionStart = i + 1;
    }
}

这是有效的,但是如果我想通过退格删除文本,显然我不能删除点,因为再次调用了事件。

有什么更好的解决方法?

解决

有效 但如果可以,你可以修复我的算法。

        public string oldText = "";
        public string currText = "";
        private void TextBox1_TextChanged(object sender, TextChangedEventArgs e)
        {
            oldText = currText;
            currText = TextBox1.Text;
            if (oldText.Length > currText.Length)
            {
                oldText = currText;
                return;
            }
            if (TextBox1.Text.Length == currText.Length)
            {
                if (TextBox1.SelectionStart == 2 || TextBox1.SelectionStart == 5)
                {
                    TextBox1.Text += ".";
                    TextBox1.SelectionStart = TextBox1.Text.Length;
                }
            }

        }

4 个答案:

答案 0 :(得分:1)

我会在KeyPress事件中执行此操作,因此您可以按照它的类型进行过滤(使用KeyChar参数和Char.IsLetter()以及类似的函数)。

此外,在按下 next 键时添加点。如果用户键入“12”,则不要添加点。当用户按1添加第二个“12”时,再添加(在新角色之前)。

答案 1 :(得分:1)

在xaml控件中使用字符串格式,如此

StringFormat='{}{0:dd.MM.yyyy}'

我刚试过它,这甚至可以将斜线转换成点。

例如

<TextBox.Text>
 <Binding Path="Person.DateOfBirth" UpdateSourceTrigger="LostFocus" StringFormat='{}{0:dd.MM.yyyy}'></Binding>
</TextBox.Text>

如果您使用的是日期选择器,则需要使用上面的字符串格式覆盖其文本框模板,如下面的链接。

This link may help if if you are trying to apply it to a datepicker.

答案 2 :(得分:0)

我建议您使用DateTimePicker并将其Format属性更改为Short。另一种方法是将您的TextBox更改为MaskedTextBox并将其掩码属性更改为ShortDate (00/00/0000)DateTimePicker可让您在验证日期时间值方面做不了多少工作。但是如果你使用MaskedTextBox,你应该验证它。示例link显示了如何进行验证。

答案 3 :(得分:0)

我修改了以上代码

        private void txt_in1_TextChanged(object sender, TextChangedEventArgs e)
    {
       int i = txt_in1.SelectionStart;
       if (bsp1 != 1)
       {
           if (i == 2)
           {
               txt_in1.Text += ":";
               txt_in1.SelectionStart = i + 1;
           }
       }

    }

    private void txt_in1_KeyUp(object sender, KeyEventArgs e)
    {
        if (e.Key == Key.Back)
        {
            bsp1 = 1;
        }
        else
        {
            bsp1 = 0;
        }
    }

我已经采取了另一个事件,即keyup(等效按键事件),因为每当检测到退格时,它将标记bsp1变量,实际停止文本更改事件以放置“:”。这里“bsp1”被定义为全局变量。 (代码适用于wpf,c#)。