Vb.net 将文本框文本从表单传递到模块

Vb.net 将文本框文本从表单传递到模块,vb.net,winforms,Vb.net,Winforms,我有一个应用程序从vb6迁移到vb.net 我想访问模块搜索字段中textbox1的文本 我不想将其作为参数传递,因为我要传递的控件太多了 请提供一些例子 我的代码是frmNew page have Textbox1 Private Sub Ok_Click(.....) call SearchFields() Me.Close() End Sub 在模块内部,我有下面的方法 Sub SearchFields() Dim str As string Dim frm

我有一个应用程序从vb6迁移到vb.net

我想访问模块搜索字段中textbox1的文本

我不想将其作为参数传递,因为我要传递的控件太多了

请提供一些例子

我的代码是frmNew page have Textbox1

Private Sub Ok_Click(.....)
   call SearchFields()
   Me.Close()
End Sub
在模块内部,我有下面的方法

Sub SearchFields()
    Dim str As string
    Dim frm As New frmNew
    str = frm.Textbox1.Text
End Sub

frmNew.Textbox1.Text无需执行任何操作,请尽可能少地重新编码,您可以将两种方法更改为以下方法。要使其正常工作,Textbox1必须标记为public。我个人不得不将VB6应用程序“迁移”到.Net,正如@LarsTech所指出的,这需要重新思考你的应用程序,而不仅仅是修改语法

Private Sub Ok_Click(.....)
   call SearchFields(Me)
   Me.Close()
End Sub

Sub SearchFields(Form frm)
    Dim str As string

    str = frm.Textbox1.Text
End Sub

您可以传递对用于搜索文本的控件的引用。这使SearchFields方法更加通用。例如,我创建了一个名为
frmNew
的表单和一个名为
search
的模块。在表单上,我放置了一个名为
Ok
的按钮、一个文本框和一个组合框

Public Class frmNew

    Private Sub Ok_Click(sender As Object, e As EventArgs) Handles Ok.Click
        Searching.SearchFields(TextBox1)
        Searching.SearchFields(ComboBox1)
        Me.Close()

    End Sub

End Class
有两种方法可以处理传递给模块的控件(我将其命名为
search
)。首先,您可以检查控件的类型并根据该类型采取操作:

Module Searching

    Sub SearchFields(textSource As Control)
        Dim str As String = ""

        ' just for invesigating, show the type of the control.
        Console.WriteLine(TypeName(textSource))

        If TypeOf textSource Is System.Windows.Forms.TextBox Then
            str = textSource.Text

        ElseIf TypeOf textSource Is System.Windows.Forms.ComboBox Then
            Dim src = DirectCast(textSource, ComboBox)
            If src.SelectedIndex >= 0 Then
                str = src.SelectedItem.ToString()
            Else
                ' nothing was selected. Do whatever is appropriate.
                str = "NOTHING SELECTED!"
            End If

        End If

        'TODO: the searching code.
        Console.WriteLine(str)

    End Sub

End Module
或者,您可以利用方法重载,其中它运行与您传递给它的参数对应的方法版本:

Module Searching

    Sub SearchFields(src As TextBox)
        DoSearch(src.Text)
    End Sub

    Sub SearchFields(src As ComboBox)
        'TODO: check an item is selected.
        Dim txt = src.SelectedItem.ToString()
        DoSearch(txt)
    End Sub

    Private Sub DoSearch(s As String)
        ' do the search
        Console.WriteLine(s)
    End Sub

End Module

请先提供一些代码。已添加注释
Dim frm,因为新frmNew
未引用现有表单。您必须将引用作为参数传递。迁移到.Net将要求您重新考虑程序的结构。通常,模块应替换为类。请尽量避免使用全局变量。请问,您需要什么?要打开另一个表单以输入值或从当前表单的文本框中获取值?
frm.Textbox1.text
不应为空。事实上,我不知道它怎么会一无所获,至少应该是String.Empty(
“”
)。不管怎样,你想做什么?请用10个或更少的词解释。谢谢你的提示。。。现在我得到了正确的值。但我面临的一件事是SearchFields()方法是从几个表单调用的,所以我应该从那里传递什么参数。如果TextBox并不总是命名为Textbox1,我建议将参数从Form改为TextBox,并直接传递正确的TextBox控件。如果它总是被命名为Textbox1,那么您可以始终传递给我(我是对当前对象的引用),并且SearchFields方法将始终具有正确的实例。如果您想获得最大的可重用性和可持续性,请重构该方法以获取文本框。