【问题标题】:Restrict to only English chars仅限英文字符
【发布时间】:2010-12-03 03:18:15
【问题描述】:

我有一个带有一些编辑框的 Winform。

表单也可以加载其他语言,比如中文! 要求是某些文本框应该只接受英文字符 例如当用户在 Tex 框 1 中输入时,它应该是英文 而如果他在文本框 2 和 3 中键入它应该是中文的?

有没有可能做这样的事情!

【问题讨论】:

    标签: c# winforms


    【解决方案1】:

    是的,这当然是可能的。您可以添加一个检查字符的验证事件处理程序。您可以有一个允许字符的字典,或者如果您将字符限制为某种编码(可能是 UTF-8),您可以使用 <> 将字符与一系列字符进行比较。

    更具体地说:您可以处理KeyPress 事件。如果e.KeyChar无效,则将e.Handled设置为true

    试试这个:

    private void textBox_KeyPress(object sender, KeyPressEventArgs e)
    {
        if (System.Text.Encoding.UTF8.GetByteCount(new char[] { e.KeyChar }) > 1)
        {
            e.Handled = true;
        }
    }
    

    【讨论】:

    • 确实不错的选择,但是 id 使用允许的字符列表来代替,使用 foreach...如果我们的字符等于列表中的任何字符,则将事件设置为已处理并返回, 否则设置为 false
    • 在这种情况下,您不应该使用 foreach。相反,请使用List<char>.Contains()
    • 我用了你的方法,效果很好,但是当我复制粘贴时它允许它,你能给出一个解决方案提示
    【解决方案2】:

    对于句柄复制和粘贴,请尝试以下操作。它可能不是最好的解决方案,但它会修剪掉非 UTF8 字符。

        private void Control_KeyDown(object sender, KeyEventArgs e)
        {
            //Prevent the user from copying text that contains non UTF-8 Characters
            if (!e.Control || e.KeyCode != Keys.V) 
                return;
    
            if (Clipboard.ContainsText() &&
                Clipboard.GetText().Any(c => System.Text.Encoding.UTF8.GetByteCount(new[] {c}) > 1))
            {
                char[] nonUtf8Characters = 
                    Clipboard.GetText().Where(c => System.Text.Encoding.UTF8.GetByteCount(new[] {c}) <= 1).ToArray();
    
                if (nonUtf8Characters.Length > 0)
                {
                    Clipboard.SetText(new String(nonUtf8Characters));
                }
                else
                {
                    Clipboard.Clear();
                }
    
                e.Handled = true;
            }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-18
      • 1970-01-01
      • 2016-10-08
      • 1970-01-01
      • 2012-07-18
      • 1970-01-01
      相关资源
      最近更新 更多