在我的Textbox
上,仅使用Keypressed
事件接受字母数字字符和下划线,但是当我右键单击文本框并粘贴特殊字符并接受它时,我遇到了问题
是否有一种方法可以在单击粘贴之前从那里验证字符串?
任何答案都会帮助您!
答案 0 :(得分:3)
您可以
1-禁用用于禁用Ctrl-C,Ctrl-V和第二行的文本框的快捷方式(将分配一个空的上下文菜单,不包含任何项目,并且将覆盖原始的上下文菜单),并且不会出现上下文菜单(因为它没有项目):
textBox1.ShortcutsEnabled = false;
textBox1.ContextMenu = new ContextMenu();
2-如果您不想禁用粘贴选项,则可以使用文本框的TextChanged
事件并在此处验证粘贴的文本。
答案 1 :(得分:2)
TextChanged
太晚了,它在控件文本更改后出现,并导致尴尬的用户体验。
要获得更好的用户体验,最好处理WM_PASTE
消息并去除不允许的字符,然后将经过清理的测试粘贴到SelectedText
上。
TextChanged
事件有点迟了,用户体验还不够友好,它在文本属性更改后删除了令人讨厌的字符。通过处理WM_PASTE
和OnKeyPress
,您可以始终将插入符号保持在用户期望的位置,清理输入而没有任何闪烁。
这里是一个示例,该示例允许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);
}
}
}