0

我有 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创建时只创建这个(?)
谢谢。

4

3 回答 3

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']

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

于 2012-04-11T11:30:43.420 回答
1

只要您的个人表单从不同时运行或您的错误提供程序是可重入的,并且您的错误提供程序不需要返回到您的表单的永久链接,这种方法就有效。从您展示的示例中,您的提供者似乎要求您传递设置错误状态的控件,因此它很有可能重新进入。

于 2012-04-11T10:43:54.457 回答
0

我认为您可以创建一个继承文本框类的新类并在其中添加您的验证,然后创建一个作为您的类的新控件并在您需要的任何地方使用它,在这种情况下,您稍后将在一个地方编辑/修改您的验证.

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

于 2012-04-11T10:46:51.047 回答