我找到了以下解决方案来将文本框限制为数字。我的 GUI 中有 20 个文本框,有没有比制作 20 个这样的函数更简洁的方法?
private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
e.Handled = !char.IsDigit(e.KeyChar) && !char.IsControl(e.KeyChar);
}
答案 0 :(得分:0)
我的建议是将需要此功能的标准 TextBox 控件替换为自定义控件,该控件还可以在控件中粘贴文本或在设计器中设置控件的 Text
属性时过滤用户输入, 使用 PropertyGrid。
如果只处理 KeyPress
事件,则无法防止错误粘贴。
我认为最好过滤 Text
属性中设置的内容,以避免误解。
测试这个简单的自定义文本框控件:它处理直接用户输入和在运行时粘贴的文本。
将 UserPaste
属性设置为 Disallow
,将忽略粘贴,而将其设置为 NumbersOnly
(默认)仅允许数字:如果在控件中粘贴混合字符,则仅保留数字。
要同时允许输入逗号和点,请更改 [^0-9,.\b]
中的正则表达式。
Designer 中设置的 Text 属性也会被过滤。
要使用此自定义控件替换现有的 TextBox 控件,您可以使用 Visual Studio 中的查找/替换功能(通常使用 CTRL+H 激活):
using System.ComponentModel;
using System.Text.RegularExpressions;
using System.Windows.Forms;
[ToolboxItem(true)]
[DesignerCategory("Code")]
public class TextBoxNumbers : TextBox
{
private Regex regex = new Regex(@"[^0-9\b]", RegexOptions.Compiled);
public TextBoxNumbers() { }
public override string Text {
get => base.Text;
set { if (!base.Text.Equals(value)) base.Text = regex.Replace(value, ""); }
}
public enum PasteAction {
NumbersOnly,
Disallow
}
[DefaultValue(PasteAction.NumbersOnly)]
public PasteAction UserPaste { get; set; }
protected override void OnKeyPress(KeyPressEventArgs e)
{
if (regex.IsMatch(e.KeyChar.ToString())) {
e.Handled = true;
}
base.OnKeyPress(e);
}
protected override void WndProc(ref Message m)
{
switch (m.Msg) {
case NativeMethods.WM_PASTE:
switch (UserPaste) {
case PasteAction.Disallow:
return;
case PasteAction.NumbersOnly:
string text = Clipboard.GetText(TextDataFormat.UnicodeText);
text = regex.Replace(text, "");
NativeMethods.SendMessage(this.Handle, NativeMethods.EM_REPLACESEL, 1, text);
return;
}
break;
}
base.WndProc(ref m);
}
}
NativeMethods
类:
using System.Runtime.InteropServices;
private class NativeMethods
{
internal const int WM_PASTE = 0x0302;
internal const int EM_REPLACESEL = 0xC2;
[DllImport("User32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
internal static extern int SendMessage(IntPtr hWnd, uint uMsg, int wParam, string lParam);
}
答案 1 :(得分:0)
我的简单和首选解决方案是编写一次方法,然后转到设计器并选择需要它的每个文本框,单击属性中的事件按钮,滚动到 KeyPress 事件和单击一次,现在应该会出现一个下拉箭头,在那里选择您的方法 - 完成。
private void textBox_KeyPress(object sender, KeyPressEventArgs e)
{
e.Handled = !char.IsDigit(e.KeyChar) && !char.IsControl(e.KeyChar);
}