在VB.NET其他表单中声明WebBrowser

时间:2014-10-19 18:37:51

标签: vb.net visual-studio-2010

我正在开发一个以其他形式拥有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

1 个答案:

答案 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属性,以便您可以通过另一个。因此,您无法获取特定表单实例。