【问题标题】:How to hold reference to different forms with one variable如何使用一个变量保持对不同形式的引用
【发布时间】:2020-04-09 20:27:58
【问题描述】:
  • 我有一个具有固定大小和一些控件的表单(名为 Form1)。
  • 我创建了另一个表单(名为 Form2),它是 Form1 的副本,唯一的区别是固定大小不同。
  • 我创建了一个“SharedForm”表单,其中包含两个表单使用的子项和函数(因此我不必为每个表单编写它们)。

我的问题是:我不知道如何为任何一种形式保留参考(一次只有一个,永远)。

如果我将 FormRef 变量声明为 Form,则会收到“label1 不是表单成员”的错误消息。 (否则,如果我声明为 Form1 或 Form2 它可以正常工作,但当然只适用于一种形式)


SharedForm 如下所示:

Public Class SharedForm

    Public Shared FormRef As Form 'problem is here

    Private Sub SharedForm_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        FormRef = New Form2
        FormRef.Show()
    End Sub

    Public Shared Sub Button1_Click(sender As Object, e As EventArgs)
        FormRef.Label1.Text = "test"
    End Sub

End Class

Form1 和 Form2 是这样的。

Public Class Form1
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        AddHandler Button1.Click, AddressOf SharedForm.Button1_Click
    End Sub
End Class

Public Class Form2
    Private Sub Form2_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        AddHandler Button1.Click, AddressOf SharedForm.Button1_Click
    End Sub
End Class

【问题讨论】:

  • 当 Form1 可以同时完成两者的工作时,为什么要创建一个新的 Form 类并不明显。第二个实例只需要不同的 Size 值。
  • @HansPassant 这是因为它更容易处理设计方面的问题,它不是标准形式而是复杂的形状,按钮甚至是单独“制作”的。将所有内容设置在应有的位置和使用另一种形式的动画会更容易。
  • @CruleD 您对使用Option Strict Off 感觉如何?如果你没问题,你可以简单地将FormRef声明为Object
  • SharedForm 是由其他两种形式共享的基础Form 类,还是只是一个辅助类,其他两种形式中的每一个都包含一个实例?无论哪种方式,这似乎都是以两种形式共享功能的自然场所。事实是,如果它不是基于共享的类,它可能应该是,那么Label1 可以在该类中,并且您的FormRef 可以声明为该类型。不幸的是,您的问题缺少minimal reproducible example,因此太模糊而无法实际回答。
  • @JayV - 请不要建议Option Strict Off。你不妨说Run With Scissors

标签: vb.net winforms


【解决方案1】:

只是一个类,而不是一个表单。

Public Class EventCode
    Public Shared Sub Button1Click(Sender As Form)
        Dim frm As Form = Nothing
        If Sender.Name = "Form1" Then
            frm = DirectCast(Sender, Form1)
        ElseIf Sender.Name = "Form2" Then
            frm = DirectCast(Sender, Form2)
        End If
        frm.Controls("Label1").Text = "Hello World"
    End Sub
End Class

在表格 1 中

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    EventCode.Button1Click(Me)
End Sub

Form1 上的标签显示“Hello World”

在 Form2 中

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    EventCode.Button1Click(Me)
End Sub

Form2 上的标签显示“Hello World”

【讨论】:

  • 谢谢玛丽,虽然我在看到这个之前设法做到了。在处理了一些 MS 错误后,我得到了:继承 Form 的 Form1、继承 Form1 的 Form2 和继承 Form 的 SharedForm。 Form2 使用 Form1 中的代码,但并不知情,而一些额外内容则在 SharedForm 中处理。
猜你喜欢
  • 2019-09-13
  • 1970-01-01
  • 2019-06-12
  • 2017-06-30
  • 1970-01-01
  • 1970-01-01
  • 2015-10-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多