全局对象与否

本文关键字:对象 全局 | 更新日期: 2023-09-27 18:30:48

我有WinForms应用程序和多个表单,并希望在每个表单上使用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中创建这个(?
谢谢。

全局对象与否

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

拥有全局对象是可以的,但如果可能的话,我宁愿将其设置为静态无状态类。无状态将允许轻松的线程安全。在 .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']

如果需要更多信息,请查看扩展方法文档。

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

如果您有非常不同的验证创建 2 个类,例如:数字文本框和字符串文本框