全球对象与否?

时间:2012-04-11 10:35:33

标签: c# .net winforms

我有WinForms应用程序和多个表单,并希望在每个 EDIT:上使用ErrorProvider组件来检查用户输入是否正常(例如,如果输入的数字在范围内等...)在我看来,将这个组件放到每个表单上是没用的。如果我创建一个全局对象(或如何调用它)并在每个表单上使用它会怎么样?

我的想法:

namespace MyApplication {  
static class Program {  

public static ErrorProvider EP = new ErrorProvider();
...

然后以个人形式处理ValidatingValidated事件:

private void txtBox1_Validating(object sender, System.ComponentModel.CancelEventArgs e) {
  if (txtBox1.Text != "correct text") {
    e.Cancel = true;
    Program.EP.SetError(txtBox1, "You have error in your input");
...

这是正确的做法还是我应该以其他方式做到这一点?

如果我需要更多全局对象,也许我应该将它们全部放在一个单独的静态类中,并在Program中创建这个(?) 感谢。

3 个答案:

答案 0 :(得分:1)

只要您的个人表单永远不会同时运行或您的错误提供程序是可重入的,并且您的错误提供程序不需要永久链接回您的表单,此方法就有效。从您显示的示例中可以看出,您的提供程序要求您传递用于设置错误状态的控件,因此很有可能重新进入。

答案 1 :(得分:1)

拥有全局对象是可以的,但如果可能的话,我宁愿让它成为静态无状态类。无状态将允许简单的线程安全。跨.NET通常具有全局(在命名空间内)静态类,例如FileInfoConvert

如果您只需要一些全局方法并且它们在UI元素上运行,您还可以为System.Windows.Controls.Control甚至System.Windows.Controls.TextBox编写一些扩展方法,如果这是您想要的唯一控件。这将为您提供更好的代码:

txtBox1.Validate("correct text", "You have error in your input");

扩展方法可能如下所示:

public static class MyExtension
{
    public static void Validate(this TextBox myTextBox, string correctText, string error)
    {
        if(myTextBox.Text != correctText)
            Console.WriteLine(string.Format("{0} [{1} == '{2}']", error, myTextBox.Name, myTextBox.Text));
    }
}

哪个会在控制台中显示此消息:

You have error in your input [txtBox1 == 'some text']

如果您需要更多信息,请查看扩展程序documentation

答案 2 :(得分:0)

我认为你可以创建一个继承textbox类并在那里添加验证的新类,然后创建一个新的控件,这是你的类,并在任何需要的地方使用它,在这种情况下,你将在一个编辑/修改你的验证放在后面。

我有非常不同的验证创建2个类,例如:NumericTextBox和StringTextBox