全局对象与否
本文关键字:对象 全局 | 更新日期: 2023-09-27 18:30:48
我有WinForms应用程序和多个表单,并希望在每个表单上使用ErrorProvider
组件 编辑:检查用户输入是否正确(例如,输入的数字是否在范围内等...在我看来,将这个组件放到每个表单上是没有用的。如果我创建一个全局对象(或如何调用它)并在每个表单上使用它怎么办?
我的想法:
namespace MyApplication {
static class Program {
public static ErrorProvider EP = new ErrorProvider();
...
然后以该个人形式处理Validating
和Validated
事件:
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 中,具有全局(在命名空间内)静态类(例如 FileInfo
或 Convert
)是很常见的。
如果您只需要几个全局方法并且它们对 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 个类,例如:数字文本框和字符串文本框