我在WindowForm中有Form。
我想捕获已编写的特定字符(unicode)
我想只允许用1种语言写作。
作为示例我想在我的程序中只允许使用英语和希伯来语。
我怎么能这样做?当别的东西写完时我怎么处理?
我知道
的OnKeyPress
的onkeydown
但是只有当英文字母被写入时我才能e.handle
。
我如何通过unicode或其他任何语言来完成它?
提前谢谢
答案 0 :(得分:2)
您可以使用KeyPress
并检查角色的范围。您可以查看范围表,例如here
然后代码变得容易(这都是未经测试的):
private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
var unicodeValue = (int)e.KeyChar;
if(unicodeValue >= 0 && unicodeValue <= 0x024F) // it's latin
return;
if(unicodeValue >= 0x0590 && unicodeValue <= 0x05FF) // it's hebrew
return;
// otherwise, don't allow it
e.Handled = true;
}
你当然可以创建一个表和辅助函数(并删除这两个ifs
并将它们放在一起)但我会把它留给你。
要小心:这不能处理副本&amp;粘贴或其他在文本框中输入文本的方法(例如,抓住文本框句柄并发送WM_SETTEXT
)。
KeyPress
就可以了,但您应该始终在TextChanged
上验证您的整个输入。
这可以通过类似的东西来完成(再次,完全未经测试并在堆栈溢出编辑器上直接写入,小心处理):
private bool IsCharAllowed(char c)
{
var unicodeValue = (int)c;
if(unicodeValue >= 0 && unicodeValue <= 0x024F) // it's latin
return true;
if(unicodeValue >= 0x0590 && unicodeValue <= 0x05FF) // it's hebrew
return true;
// otherwise, don't allow it
return false;
}
private bool _parsingText = false;
private void textBox1_TextChanged(object sender, EventArgs e)
{
// if we changed the text from within this event, don't do anything
if(_parsingText) return;
var textBox = sender as TextBox;
if(textBox == null) return;
// if the string contains any not allowed characters
if(textBox.Text.Any(x => !IsCharAllowed(x))
{
// make sure we don't reenter this when changing the textbox's text
_parsingText = true;
// create a new string with only the allowed chars
textBox.Text = new string(textBox.Text.Where(IsCharAllowed).ToArray());
_parsingText = false;
}
}
你也可以使用正则表达式,但老实说,我从来没有做过任何一种非拉丁语的unicode正则表达式,所以我无法帮助那里。
PS:因为我发布的TextChanged
事件重建了整个字符串,如果有任何不允许的字符(如果字符串足够长,这可能会变慢),我还有这个 到KeyPress
处理
PS2:reentry-prevention并不是必需的,因为字符串在重新输入时是正确的并且不会被修改,但是我们避免Any()
检查(它迭代字符串的每个字符) ,并且 - 如果字符串很长,则可能很慢)
答案 1 :(得分:0)
您可以使用正则表达式(
)简单验证输入的文本 Plugin.call(this, this, [], '', null);
并在text_changed事件中捕获它。