如何在项目范围内共享控件特定的事件处理程序

本文关键字:事件处理 程序 共享控件 项目 范围内 | 更新日期: 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;
    }
}