如何在项目范围内共享控件特定的事件处理程序
本文关键字:事件处理 程序 共享控件 项目 范围内 | 更新日期: 2023-09-27 18:30:07
我可以编写一个事件,将文本框条目限制为十进制值,如下所示:
private void txtbxPlatypus_KeyPress(object sender, KeyPressEventArgs args)
{
const int BACKSPACE = 8;
const int DECIMAL_POINT = 46;
const int ZERO = 48;
const int NINE = 57;
const int NOT_FOUND = -1;
int keyvalue = (int)args.KeyChar; // not really necessary to cast to int
if ((keyvalue == BACKSPACE) || ((keyvalue >= ZERO) && (keyvalue <= NINE))) return;
// Allow the first (but only the first) decimal point
if ((keyvalue == DECIMAL_POINT) && ((sender as TextBox).Text.IndexOf(".") == NOT_FOUND)) return;
// Allow nothing else
args.Handled = true;
}
然后将页面上具有相同条目过滤要求的其他TextBox附加到该事件处理程序:
txtbxSeat.KeyPress += txtbxPlatypus_KeyPress;
txtbxLunch.KeyPress += txtbxPlatypus_KeyPress;
然而,如果我想在整个项目范围内共享这样一个处理程序,而不是必须在每个有文本框的页面上复制它,而这些文本框的输入需要以这种方式进行限制,该怎么办?
是否有一种方法可以设置"全局"(项目范围)事件处理程序委托,该委托可以从项目中的任何形式使用?
更新
这确实有效:
public static class SandBoxUtils
{
public static void DecimalsOnlyKeyPress(object sender, KeyPressEventArgs args)
{
// same code as above in txtbxPlatypus_KeyPress()
}
}
public Form1()
{
InitializeComponent();
textBoxBaroqueMelodies.KeyPress += new
System.Windows.Forms.KeyPressEventHandler(SandBoxUtils.DecimalsOnlyKeyPress);
}
但我觉得有点可疑。这样做有什么"错误"(或危险)吗?
创建从System.Windows.Forms.TextBox
派生的自己的类
在构造函数中添加KeyPress
事件的事件处理程序
生成项目后,新控件必须出现在Visual Studio的控件工具箱中,
从那里你可以把它拖到表单上,然后使用。。。
class TextBoxDecimal : System.Windows.Forms.TextBox
{
const int BACKSPACE = 8;
const int DECIMAL_POINT = 46;
const int ZERO = 48;
const int NINE = 57;
const int NOT_FOUND = -1;
const char DECIMALSEPARATOR = '.';
public TextBoxDecimal() :base()
{
this.KeyPress += TextBoxDecimal_KeyPress;
}
void TextBoxDecimal_KeyPress(object sender,
System.Windows.Forms.KeyPressEventArgs e)
{
int keyvalue = (int)e.KeyChar; // not really necessary to cast to int
if ((keyvalue == TextBoxDecimal.BACKSPACE) || ((keyvalue >= TextBoxDecimal.ZERO) && (keyvalue <= TextBoxDecimal.NINE))) return;
// Allow the first (but only the first) decimal point
if ((keyvalue == TextBoxDecimal.DECIMAL_POINT) && ((sender as TextBoxDecimal).Text.IndexOf(TextBoxDecimal.DECIMALSEPARATOR) == NOT_FOUND)) return;
// Allow nothing else
e.Handled = true;
}
}