【问题标题】:Alphanumeric Textbox - Validate/Sanitize clipboard text before paste字母数字文本框 - 粘贴前验证/清理剪贴板文本
【发布时间】:2018-12-08 07:34:36
【问题描述】:

在我的Textbox 上,使用Keypressed 事件仅接受字母数字字符和下划线,但是当我右键单击文本框并粘贴特殊字符并接受它时遇到问题

有没有办法在点击粘贴之前从那里验证字符串?

任何答案都会有所帮助,谢谢!

【问题讨论】:

  • 试试TextChanged事件
  • 我编辑了我的答案,请看一下。

标签: c# .net winforms textbox


【解决方案1】:

你可以

1- 禁用将禁用 Ctrl-C、Ctrl-V 和第二行的文本框的快捷方式(将分配一个空的上下文菜单,没有项目并将覆盖原始上下文菜单)并且不会出现上下文菜单(因为它没有项目):

textBox1.ShortcutsEnabled = false;
textBox1.ContextMenu = new ContextMenu();

2-如果您不想禁用粘贴选项,您可以使用文本框的TextChanged 事件并在那里验证粘贴的文本。

【讨论】:

  • 谢谢先生,但我需要选择选项 2。
【解决方案2】:

TextChanged 有点晚了,它在控件的文本更改后引发,并导致尴尬的用户体验。

为了获得更好的用户体验,最好处理WM_PASTE 消息并去除不允许的字符并将经过清理的测试粘贴到SelectedTextTextChanged 事件有点晚,用户体验不够友好,它在文本属性更改后删除字符,这很烦人。通过处理WM_PASTEOnKeyPress,您可以始终将插入符号保持在用户期望的位置,净化输入而不会出现任何闪烁。

字母数字文本框

这是一个示例,它允许TextBox 使用字母数字字符和下划线。按键时,如果字符不被允许,它会发出哔声。在粘贴中,如果字符串包含不允许的字符,它会去除字符并仅粘贴有效字符:

using System;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text.RegularExpressions;
using System.Windows.Forms;
public class MyTextBox : TextBox
{
    private const int WM_PASTE = 0x0302;
    [DllImport("user32.dll", CharSet = CharSet.Auto)]
    public static extern bool MessageBeep(int type);
    protected override void WndProc(ref Message m)
    {
        if (m.Msg != WM_PASTE) { base.WndProc(ref m); }
        else
        {
            var text = SanitizeText(Clipboard.GetText());
            SelectedText = text;
        }
    }
    protected virtual string SanitizeText(string value)
    {
        return Regex.Replace(value ?? "", @"[^a-zA-Z0-9_]", "");
    }
    protected override void OnKeyPress(KeyPressEventArgs e)
    {
        var input = e.KeyChar;
        var allowedChars = new char[] { '_', '\b' };
        if (((ModifierKeys & (Keys.Control | Keys.Alt)) != 0) |
            Char.IsLetterOrDigit(e.KeyChar) |
            allowedChars.Contains(input))
        {
            base.OnKeyPress(e);
        }
        else
        {
            e.Handled = true;
            MessageBeep(0);
        }
    }
}

【讨论】:

  • 您还可以更改SanitizeText 方法以仅进行验证以防止粘贴而不是清理输入。我更喜欢敏化,它更自然 IMO。
  • 先生,我该如何使用 WndProc?它应该像一种方法吗?
  • 我创建了一个名为MyTextBox 的新类,它派生自TextBox。创建一个新文件并将上面的代码粘贴到文件中。重建您的项目,然后将MyTextBox 的实例从工具箱放到您的表单中。
  • 我尝试过使用 public class MyTextBox : Bunifu.Framework.UI.BunifuMaterialTextbox 但我遇到了 SelectedText = text 的问题,它说在当前上下文中不存在。顺便说一句,我使用 Bunifu 框架。有没有办法解决这个问题?
  • 无论如何,最好将此线程专用于TextBox 控件,因为它更受欢迎并且问题是关于TextBox。您可能想问另一个关于如何将此类内容应用于 banifu 文本框的问题。
猜你喜欢
  • 2018-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-02
  • 1970-01-01
  • 2017-04-16
  • 1970-01-01
相关资源
最近更新 更多