【问题标题】:Single instance of non modal form in non mdi application非 mdi 应用程序中非模态形式的单个实例
【发布时间】:2013-09-05 10:32:14
【问题描述】:

我需要一种形式作为单实例形式。
这是一种“工具形式”,我不能用 NEW 开始它,因为它忘记了用户输入。 但是,在这种形式中,我有 Sub New,我在其中初始化了一些需要的东西。

如果我像这样从主表单调用此表单:

With frm_iemail()
    .StartPosition = FormStartPosition.Manual
    .FormBorderStyle = Windows.Forms.FormBorderStyle.None
    .Show(Me)
End With

我得到错误:

'frm_iemail' 是一种类型,不能用作表达式。

但如果我这样称呼它:

Dim eform As New frm_iemail()
With eform
etc...

那么没有错误,但是在文本框中输入的文本被删除了不需要的内容。

如何在这里获得所需的功能?

【问题讨论】:

  • 所以表单已经打开,您想重新激活它。对吗?
  • 是的,我想要。

标签: vb.net


【解决方案1】:

如果你想使用一个已经激活的表单,那么你可以使用下面的方法来获取一个激活表单的对象。

Private Function GetActiveEmailForm() As frm_iemail

    For Each lForm In System.Windows.Forms.Application.OpenForms
        If (lForm.Name = frm_iemail.Name) Then
            Return lForm
        End If
    Next

    Return New frm_iemail

End Function

主要代码会是这样的。

Dim eform As frm_iemail = GetActiveEmailForm
With eform
etc...

【讨论】:

  • 错误 1 ​​'OpenForms' 不是 'xcommon.My.MyApplication' 的成员。 xcommon 不是典型的应用程序而是 dll,这会是一个问题吗?
  • 那么,这个表单是你的应用程序的一部分还是另一个dll?当您尝试访问表单时,请告诉我表单的状态。
  • 此表单是 dll 的一部分,但应该可以从整个解决方案中访问。我调用的表单也在同一个项目,同一个 dll 中。表单的状态是什么?
  • 为什么一定要使用xcommon.My.MyApplication?你不能简单地使用 My.MyApplication.OpenForms 吗?
  • 我确实像您发布的那样使用,但这是我得到的确切错误消息。 xcommon 是一个包含这些表单的项目。
【解决方案2】:

(我认为)你的问题是这一行:

With frm_iemail()

您正在尝试在 With 语句中使用表单数组,但该语句不起作用。删除最后的括号,它应该可以工作。

在 VB 中你可以只引用表单的名称(你不必声明一个表单变量来使用它)

假设我有一个表单名称frmTest

我可以这样做:

With frmTest
    .FormBorderStyle = Windows.Forms.FormBorderStyle.None
    .Show
End With

【讨论】:

  • 删除括号后,蓝色下划线再次显示相同的错误消息。
  • 将 frm_iemail 更改为表单的实际名称 - 应该可以使用
  • 但是 frm_iemail 是我发送电子邮件的表单的实际名称(属性下的名称)。或者这里有一些“更实际”的名字?
  • 尝试在您的 frmTest 中新建 sub 并在其中放入一些代码然后尝试。
【解决方案3】:

将Private eform As New frm_iemail() 添加到调用类或表单(您将其称为“主表单”),不是在方法中,而是作为实例数据。这样它只会被创建一次。像这样的:

Class MainForm : Form

   Private eform As New frm_iemail()


   Public Sub ExampleMethod()

      With eform
         .StartPosition = FormStartPosition.Manual
         .FormBorderStyle = Windows.Forms.FormBorderStyle.None
         .Show(Me)
      End With

   End Sub

End Class

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-04
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    相关资源
    最近更新 更多