我正在开发一个以其他形式拥有WebBrowsers的项目; 我编写了下面的代码来控制这些WebBrowsers;但我需要代码来识别(声明)这些形式的WebBrowsers。
Dim openForm As Form = Nothing
For Index As Integer = My.Application.OpenForms.Count - 1 To 0 Step -1
openForm = My.Application.OpenForms.Item(Index)
If openForm IsNot Me Then
MyWebBrowser.navigate("http://www.google.com/") ' PROBLEM IN THIS LINE
End If
Next
我的模块创建如下:
Module MMMBrowser
Dim frmNew As New Form
Dim MekdamBrowser As New WebBrowser
答案 0 :(得分:1)
从评论中收集的其他信息:
frmNew
OpenForms
找到最后一个循环的原因。MekdamBrowser
引用是尝试引用表单上的浏览器。简单的事情就是为外人提供一种方法,告诉表单使用新的Sub
导航到某个地方,并让表单驱动浏览器控件。这可能消除了对全局MekdamBrowser引用的需要。在浏览器表单中添加如下内容:
Public Sub GotoNewURL(url As String)
myWebBrowserName.navigate(url)
End Sub
此过程仅适用于Form1
而非通用Form
类型,因此我们需要更改您要找到要使用的表单的方式。你现有的循环很不稳定。它只会找到不是当前表单的表单的最后一个实例。如果您添加第三种表单类型,它将无法正常工作:
Dim lastBrowserFrm As Form1 ' use the class name!
' this will try to get the last Instance of Form1
lastBrowserFrm = Application.OpenForms.OfType(Of Form1)().LastOrDefault
' LastOrDefaultcan return nothing if there are none,
' so test
If lastBrowserFrm IsNot Nothing Then
lastBrowserFrm .GotoNewUrl("www.stackoverflow.com")
Else
' create a new one, I guess
End If
你的循环没有考虑到集合中可能有其他表单类型不是Form1
,或者即使新的浏览器表单是最后一个创建的!现在这一点更为重要,因为GotoNewURL
仅适用于Form1
个实例。
我将名称更改为lastBrowserFrm
以反映真正的名称 - 它只会找到最后创建的名称。如果您尝试使用特定的实例,则需要提供一种方法来跟踪您创建的实例,例如使用List(of Form1)
或使用Name属性,以便您可以通过另一个。因此,您无法获取特定表单实例。