我在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;
}
}
}
答案 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#)。