我有这段代码:
foreach (char ch in e.Text)
{
if (!Char.IsDigit(ch))
e.Handled = true;
else
{
if(!(ch.Equals(':')))
e.Handled = true;
}
}
只有
时if (!Char.IsDigit(ch))
e.Handled = true;
我可以写数字,当我只使用第二个if()时,我只能写':'。 但是当我使用它们时,我什么也写不出来。
答案 0 :(得分:2)
只需使用布尔逻辑:
foreach(var ch in e.Text) {
if (!((Char.IsDigit(ch) || ch.Equals(':'))) {
e.Handled = true;
break;
}
}
答案 1 :(得分:2)
另一种方法是使用linq语句。这取决于个人偏好,但许多人发现linq更具可读性。
e.Handled = !e.Text.Any(x => Char.IsDigit(x) || ':'.Equals(x));
这是一个相当容易的单线程,随着c#6的出现,整个方法可以写成lambda函数,如下所示:
private void TextBox_PreviewTextInput(object sender, TextCompositionEventArgs e) =>
e.Handled = !e.Text.Any(x => Char.IsDigit(x) || ':'.Equals(x));
请记住,PreviewTextInput不处理空格字符,这些方法不会过滤掉它们。 MSDN forums
提供了解释因为一些IME会将空白击键视为文本合成过程的一部分,这就是Avalon通过TextInput事件报告正确的合成文本的原因。