【问题标题】:How to call a sub in first form from a second form and inserting controls into the first form如何从第二种形式调用第一种形式的子并将控件插入第一种形式
【发布时间】:2019-07-24 13:44:08
【问题描述】:

我相信这只是一个语法问题,应该不难,我只是对 VB.net 不太熟悉。我正在使用 FormA 来控制 FormB。当我从 FormA 执行命令时,我想在 FormB 上创建 1+x 个不同的控件(webbrowser)。为此,我调用了一个位于 FormB 中的 subProcedure 并从那里动态创建我的控件。问题是,没有创建或显示控件。

我知道 sub 被调用,因为我可以单步执行它,但我怀疑它试图在 FormA 中显示控件。如果我将 sub 移动到 FormA,控件将按预期在 FormA 上显示。因此,为什么我认为这是一个语法问题。那么,从代码示例来看,我将如何确保将控件添加到 FormB 中?

public sub displayonformb(byval sheetcount as integer)
for i as integer = 1 to sheetcount
    dim wb as new webbrowser
    with wb
        .name = "myname"
        .navigation(new uri("blah blah blah")
        .location = new point(((i-1)*(screenwidth / sheetcount)), hgt)
        .size = new size(wdth, hgt)
        me.controls.add(wb)
    end with
next

所以,我在这里的假设是使用 .location 或(更有可能)me.controls.add(wb) 语句。我试着改变“我”。到“FormB”。但工作室抱怨我应该使用“我”。而是。

【问题讨论】:

  • 您是在调用displayonformb 并引用打开的FormB 还是创建一个新的? new FormB().displayonformb(1)你能告诉我们你是怎么打电话给displayonformb的吗?
  • dim wb as new webbrowser。这不是真正的代码。贴出你正在使用的代码,不要在这里写一部分。上一条评论中提出的问题很重要。也发一下。实际代码。
  • 显示你如何调用方法。
  • 回答我的帖子的问题:我这样称呼该方法: Dim frm As New FormB frm.DisplayOnMainFormB(sheetCount).... 此后,我采用了以下珍贵的解决方案,将 FormB 作为方法的论据。我的“dim wb as new webbrowser”有什么问题?那是真正的代码。我可能没有复制和粘贴,但它是真实的代码。它有效。
  • @gCanuck 我猜 Jimi 想说的是,在 VS 中,代码不会那样显示。实际显示为Dim wb As New WebBrowser

标签: vb.net


【解决方案1】:

您在添加项目时使用Me.controls.add。您应该将表单作为参数传递。 这根本不是语法错误。尝试将要添加控件的表单作为参数传递给函数。

Public Sub displayonformb(ByVal sheetcount as integer, form As Form)
    For i As integer = 1 To sheetcount
        Dim wb as new WebBrowser
        With wb
            .name = "myname"
            .navigation(new uri("blah blah blah")
            .location = new point(((i-1)*(screenwidth / sheetcount)), hgt)
            .size = new size(wdth, hgt)
            form.controls.add(wb)
        end with
    Next
End Sub

【讨论】:

  • 由于Sub displayonformb 位于必须添加控件的表单上,所以Me.Controls.Add 可以。
  • @OlivierJacot-Descombes 我认为你没有得到这个问题。让我试着解释一下。 FormB 有一个方法(子)。 FormA 调用 FormB 中的方法。 FormB 中的此方法旨在将控件添加到 FormA。因此,像这样从 FormA 调用我的答案中的代码:FormB.displayonformb(10, Me) 应该可以工作。
  • 由于FormB 是一种类型,而不是表单实例或对象,因此这是行不通的。 Sub 在 FormB 中,必须在 FormB 上创建控件。 Sub 是从 FormA 调用的。
【解决方案2】:

我怀疑您在错误的表单实例上调用 sub。你正在写的地方

Dim frmB As New FormB()
frmB.Show()

你正在写的其他地方

Dim frmB As New FormB() 'Creates a new form object.
frmB.DisplayOnFormB(1)

但这是FormB 的另一个实例,它不会在任何地方显示。

相反,在字段中存储对原始表单的引用。在FormA

Public Class FormA
    Private m_frmB As FormB
    ...

然后还是在FormA打开另一个表单

m_frmB = New FormB()
m_frmB.Show()

当你想添加控件时:

m_frmB.DisplayOnFormB(1)

即,使用相同的表单实例(表单对象)。

【讨论】:

    【解决方案3】:

    来自评论:

    我这样调用方法:

     Dim frm As New FormB frm.DisplayOnMainFormB(sheetCount).... 
    

    问题在于New 关键字。这意味着您正在使用全新的FormB 的不同实例。您需要对屏幕上已显示的相同的现有实例的引用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-27
      • 1970-01-01
      • 2011-07-20
      • 1970-01-01
      • 1970-01-01
      • 2016-01-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多