如何在TextBox中书写时自动添加点
本文关键字:添加 书写 TextBox | 更新日期: 2023-09-27 17:57:57
我有一个绑定在DateTime
类型上的TextBox
。我需要在前两个字符和后两个字符后面加一个点,例如: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;
}
}
}
我会在KeyPress事件中进行,这样你就可以根据它是哪种键进行筛选(使用带有Char.IsLetter()和类似函数的KeyChar参数)。
此外,按下下一个键时添加点。如果用户输入了"12",则不要添加点。当用户按1添加第二个"12"时,请添加它(在新字符之前)。
在xaml控件中使用字符串格式,如
StringFormat='{}{0:dd.MM.yyyy}'
我刚刚测试了它,它甚至可以将斜线转换为圆点。
例如
<TextBox.Text>
<Binding Path="Person.DateOfBirth" UpdateSourceTrigger="LostFocus" StringFormat='{}{0:dd.MM.yyyy}'></Binding>
</TextBox.Text>
如果您使用的是日期选择器,则需要使用上面的字符串格式覆盖其文本框模板,如下面的链接所示。
如果您正试图将此链接应用于日期选择器,则此链接可能会有所帮助。
我建议您使用DateTimePicker
并将其Format属性更改为Short。另一个选项是将TextBox
更改为MaskedTextBox
,并将其Mask属性更改为ShortDate (00/00/0000)
。DateTimePicker
允许您在验证日期时间值方面不做太多工作。但如果您使用MaskedTextBox
,则应该对其进行验证。示例链接显示了如何进行验证。
我已经修改了上面的代码
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#)。