文本框-粘贴前验证输入

时间:2018-12-08 07:34:37

标签: c# .net winforms textbox

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

enter image description here

是否有一种方法可以在单击粘贴之前从那里验证字符串?

任何答案都会帮助您!

2 个答案:

答案 0 :(得分:3)

您可以

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

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

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

答案 1 :(得分:2)

TextChanged太晚了,它在控件文本更改后出现,并导致尴尬的用户体验。

要获得更好的用户体验,最好处理WM_PASTE消息并去除不允许的字符,然后将经过清理的测试粘贴到SelectedText上。 TextChanged事件有点迟了,用户体验还不够友好,它在文本属性更改后删除了令人讨厌的字符。通过处理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);
        }
    }
}