【发布时间】:2018-12-08 07:34:36
【问题描述】:
在我的Textbox 上,使用Keypressed 事件仅接受字母数字字符和下划线,但是当我右键单击文本框并粘贴特殊字符并接受它时遇到问题
有没有办法在点击粘贴之前从那里验证字符串?
任何答案都会有所帮助,谢谢!
【问题讨论】:
-
试试
TextChanged事件 -
我编辑了我的答案,请看一下。
在我的Textbox 上,使用Keypressed 事件仅接受字母数字字符和下划线,但是当我右键单击文本框并粘贴特殊字符并接受它时遇到问题
有没有办法在点击粘贴之前从那里验证字符串?
任何答案都会有所帮助,谢谢!
【问题讨论】:
TextChanged事件
你可以
1- 禁用将禁用 Ctrl-C、Ctrl-V 和第二行的文本框的快捷方式(将分配一个空的上下文菜单,没有项目并将覆盖原始上下文菜单)并且不会出现上下文菜单(因为它没有项目):
textBox1.ShortcutsEnabled = false;
textBox1.ContextMenu = new ContextMenu();
2-如果您不想禁用粘贴选项,您可以使用文本框的TextChanged 事件并在那里验证粘贴的文本。
【讨论】:
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);
}
}
}
【讨论】:
SanitizeText 方法以仅进行验证以防止粘贴而不是清理输入。我更喜欢敏化,它更自然 IMO。
MyTextBox 的新类,它派生自TextBox。创建一个新文件并将上面的代码粘贴到文件中。重建您的项目,然后将MyTextBox 的实例从工具箱放到您的表单中。
public class MyTextBox : Bunifu.Framework.UI.BunifuMaterialTextbox 但我遇到了 SelectedText = text 的问题,它说在当前上下文中不存在。顺便说一句,我使用 Bunifu 框架。有没有办法解决这个问题?
TextBox 控件,因为它更受欢迎并且问题是关于TextBox。您可能想问另一个关于如何将此类内容应用于 banifu 文本框的问题。