我有一个应用程序从vb6迁移到vb.net。
我想访问模块的SearchFields中的textbox1文本。
我不想将它作为参数传递,因为我有很多控件要传递。
请提供一些例子。
我的代码是frmNew页面有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什么都没得到
答案 0 :(得分:1)
要进行尽可能少的重新编码,您可以将两种方法更改为以下方法。为此,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
答案 1 :(得分:0)
您可以传递对控件的引用以用于搜索文本。这使您的SearchFields方法更加通用。例如,我创建了一个名为frmNew
的表单和一个名为Searching
的模块。在表单上,我放置了一个名为Ok
的按钮,一个TextBox和一个ComboBox。
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
有两种方法可以处理传递给模块的控件(我将其命名为Searching
)。首先,您可以检查控件的类型并根据它执行操作:
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