如何从另一种形式调用公共函数

Posted

技术标签:

【中文标题】如何从另一种形式调用公共函数【英文标题】:How to call a public function from another form 【发布时间】:2015-05-09 22:04:00 【问题描述】:

Frm1包含验证textbox的代码:

Public Function AlphabeticalOnly(ByVal Str As String) As Boolean
    Dim pattern As String = "^[a-zA-Z\s]+$"
    Dim reg As New Regex(pattern)
    If reg.IsMatch(Str) = False Then
        MsgBox(Str & " is invalid! Please enter alphabetical characters only!", MsgBoxStyle.Critical, "Error")
    End If
    Return reg.IsMatch(Str)
End Function

因为验证的次数比较多,我不想在其他形式中重复所有代码。

Private Sub btnDone_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnDone.Click
If AlphabeticalOnly(txtName.Text) = False Then
        Exit Sub
End If
...
End Sub

我用另一种形式尝试了上面的代码,但是错误列表显示AlphabeticalOnly没有声明。

我需要在代码中添加什么吗?

【问题讨论】:

【参考方案1】:

首先,不要把函数放在一个form上。如果是所有表单共享的公共代码,放在自己的类文件中。

其次,此通用代码不应通过消息框提示用户。这个函数应该只是执行逻辑而已。 (这也使函数更容易进行单元测试。)然后允许使用代码(在本例中为表单)与用户交互。 (特别是因为当前的实现检查了两次匹配,这不是必需的。)

由于此函数不依赖对象状态,您可以将其设为Shared。像这样的:

Public Class CommonFunctions
    Public Shared Function IsAlphabeticalOnly(ByVal Str As String) As Boolean
        Dim pattern As String = "^[a-zA-Z\s]+$"
        Dim reg As New Regex(pattern)
        Return reg.IsMatch(Str)
    End Function
End Class

然后您可以在表单上调用该函数:

If CommonFunctions.IsAlphabeticalOnly(txtName.Text) = False Then
    MsgBox(Str & " is invalid! Please enter alphabetical characters only!", MsgBoxStyle.Critical, "Error")
End If

【讨论】:

我会警告不要过度使用静态函数,因为它们会成为无法伪造的东西,从而使单元测试变得更加困难。否则你的答案是正确的,我不知道是谁投了反对票。 嗨大卫!你的方法就像一个魅力!但是,我发现对每个文本框使用 KeyPress 事件是一种更好的方法!还是谢谢! @Caesium95:很高兴我能帮上忙! keypress 事件也一样好,这里的重点不是使用哪个事件,而是在哪里组织公共代码。这种辅助方法肯定属于 UI 级别的辅助类而不是表单。是否应该是Shared,或者该通用代码的结构应该是什么,都值得商榷。理想情况下,随着添加更多代码,这将转向更加面向对象的设计。但是对于这一个辅助方法,目标是简单地将代码从表单中移出。

以上是关于如何从另一种形式调用公共函数的主要内容,如果未能解决你的问题,请参考以下文章

我如何从另一种方法调用 linq?

如何在一种方法中为数组赋值并从另一种方法调用

将公共属性和方法公开给 Main Activity 的片段是不是是一种不好的形式?

为啥不能从另一种方法调用main方法[关闭]

C++调用公共基类的私有/受保护函数

C#中如何在一个窗体中调用另一个窗体控件中的数据?