【问题标题】:Identify form the method is being called from识别调用方法的表单
【发布时间】:2015-01-11 03:59:08
【问题描述】:

我有多个表单正在调用的全局方法(在一个模块中)。我不知道如何传递/识别调用表单,以便在方法中引用它的控件时识别它:

Public Sub SomeFunction(callingForm As Form)
    callingForm.ErrorProvider.SetError(TextBox1, "Faux pas!")
End Sub

Public Sub SomeOtherFunction(callingForm As Form)
    SomeFunction(Me)
End Sub

在上面的示例中,我尝试将表单作为参数传递,但有人告诉我:

ErrorProvider 不是 System.Windows.Forms.Form 的成员。

【问题讨论】:

  • 调用 Type 实际上是 Form1 或类似的 - Form 是所有其他表单继承自的通用基类。出于这个原因,您不应该将类似的内容导出到通用全局处理程序 - 将数据验证留在表单中。无论如何,您最终都会添加一堆代码来解决问题
  • @Plutonix 我在一个模块中有全局方法,它以完全相同的方式在多个表单中验证所有文本框。整合它不是更有意义吗?
  • 它究竟验证了什么?我唯一能想到的在所有表格上的所有 TB 中都很常见的是不能为 0 长度。姓名、地址、邮编、州、电话、电子邮件、IP 地址、喜欢的颜色对于真实 DV 的内容都有不同的规则。
  • 如果验证函数对所有人都做同样的事情,为什么还需要传递表单参数?
  • @Plutonix 显式是指someErrorProvider As ErrorProvider 之类的东西吗?

标签: vb.net winforms visual-studio methods parameter-passing


【解决方案1】:

这很常见,希望以相同的方式处理所有表单,但又有所不同。您将希望创建每个表单都可以实现的另一个类。这使您可以做一些特定的事情……一般来说。

创建一个类似的类,调用它和你想要的函数:

Public Interface IErrorForm
    Sub MyValidate
End Interface

在您的表单中实现它:

Public Class Form1
    Implements IErrorForm

Public Sub MyValidate() Implements IErrorForm.MyValidate
    '...Your code here
    'TextBox1.Text = "Faux pas!"
End Sub

现在,无论您想在哪里调用该函数,都可以执行以下操作:

Public Sub SomeFunction(callingForm As Form)
    If GetType(IErrorForm).IsAssignableFrom(xFrm.GetType) Then
        CType(xFrm, IErrorForm).MyValidate()
    End If
End Sub

【讨论】:

  • 我创建了一个新的类文件,Class1.vb(第一个代码块)。我究竟在哪里实现类(第二个代码块)?我在Public Class SomeForm 的开头和结尾都试过了,但代码编辑器不接受它。另外,From1(第二个代码块)是否意味着读取Form1
  • 这种方法意味着他需要为每个表单重写MyValidate函数
  • 第二个块在你的表单中,在我的例子中,它是form1。在你的类声明下,输入实现代码,然后按回车键,其他代码 (Public Sub MyValidate() Implements IErrorForm.MyValidate) 将自动生成,
【解决方案2】:

Validate 函数返回值的另一种方法
正如你在 cmets 中提到的

...我的方法的主要目的之一是避免必须设置 方法外的错误,减少重复代码

据我了解,您希望检查Validate 功能,将控制作为参数,通过ErrorProvider 显示错误消息并显示错误消息。 我的建议将共享Validate函数返回字符串值,其中包含验证控件后生成的错误消息
如果没有错误则函数返回NothingString.Empty

Public Function Validate(ctrl As Object, formats As String) As String
    Dim errorMessage As String = Nothing 'or String.Empty
    ' Your validating code here
    ' If no error errorMessage = Nothing
    Return errorMessage         
End Function

然后在表单中(可能在Validated事件处理程序中)

'....
Me.MyErrorprovider.SetError(Me.MyTextBox, 
                            MyGlobalFunctions.Validate(Me.MyTextBox, "formats"))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-24
    相关资源
    最近更新 更多