【问题标题】:Using Generic List(Of Form), Trouble gathering Object's Name Property使用通用列表(表单),无法收集对象的名称属性
【发布时间】:2012-08-21 08:50:15
【问题描述】:

我最近对接口以及在默认状态下使用它们之外进一步自定义它们的能力非常感兴趣。

我一直在专门研究 IList(of T)。与 ArrayLists 相比,使用泛型列表的优势让我大吃一惊。这是test 的图片。这是进一步解释about the Test的站点。

所以,我很自然地想尝试一下。当我第一次使用 ForNext 方法遍历列表时,代码工作正常。第二次我无法访问列表中表单的名称,因为它已被释放。任何人都知道如何访问列表中的表单属性。

Public Class frmMain

    Dim Cabinet As List(Of Form) = New List(Of Form)
    Dim FormA As New Form1
    Dim FormB As New Form2
    Dim FormC As New Form3

    Private Sub frmMain_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles _Me.Load

        Cabinet.Add(FormA)
        Cabinet.Add(FormB)
        Cabinet.Add(FormC)

    End Sub



    Sub displayForm(ByVal aForm As Form)

        Dim myFormName As String = ""

        Stopwatch.Start()

        If aForm.IsDisposed = False Then
            aForm.Show()
        Else
            myFormName = aForm.(How do I access this objects Name?) 
            aForm = New Form  '<----- I would rather simply use aForm = New(aForm) 
            aForm.Name = myFormName
            aForm.Show()

        End If

        Stopwatch.Stop()

        Dim RealResult As Decimal = (Stopwatch.ElapsedMilliseconds / 1000)

        Debug.WriteLine(RealResult)

        Stopwatch.Reset()

    End Sub


    Private Sub btnForEach_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnForEach.Click

        'Dim instance as List 
        'Dim action as Action(of T) 

        'instance.ForEach(action) 
        'action = delegate to a method that performs an action on the object passeed to it

        Cabinet.ForEach(AddressOf displayForm)
    End Sub

我真的不明白为什么如果VB知道这是一个通用列表,这意味着它知道列表的类型,并且对象都被限制为表单;为什么我不能在列表中的项目上调用构造函数。前任。 aForm = 新的 aForm 或 aForm = 新的 Cabinet.aForm

有人为我撕开这个。谢谢。

【问题讨论】:

  • 好吧,我刚刚发现如果我使用 Ctype(myListObject, Form) 我可以访问 Form.text 属性。如果有人对此有 2 美分,我想听听。

标签: vb.net list foreach arraylist


【解决方案1】:

您不能构造“aForm”的新实例,因为它不是类型,而是 Form 类型的实例。

如果您想阻止 ObjectDisposedException,您可以隐藏表单而不是关闭它。将以下代码放在每个表单代码后面:

Public Class Form1

    Private Sub Form1_FormClosing(sender As Object, e As FormClosingEventArgs) Handles MyBase.FormClosing
        Dim form = CType(sender, Form)
        form.Visible = False
        e.Cancel = True
    End Sub

End Class

不过,这有点老套,但是您不需要 Else 块中的代码。

编辑 你可以试试这个:

Private Sub displayForm(ByVal aForm As Form)

    Dim indexOfCab As Integer = Cabinet.IndexOf(aForm)
    If indexOfCab <> -1 Then

        If aForm.IsDisposed Then
            aForm = CreateForm(aForm.GetType())
            Cabinet(indexOfCab) = aForm
        End If

        aForm.Show()
    End If

End Sub

Private Shared Function CreateForm(formType As Type) As Form
    Return CType(Activator.CreateInstance(formType), Form)
End Function

您不需要那种大的Select 声明。

【讨论】:

  • 我喜欢您使用它的地方,但表单的资源仍将被使用。这只是同一代码的更大实例的摘录。我需要能够同时拥有大约 20 个这样的对象。我不能让那么多表格不可见。不过,创意点数。
  • 这正是我要找的安迪!我已经在玩 Activator.CreateInstance,我只是没有尝试将 aForm 输入表单。非常非常棒。太棒了,我的朋友,谢谢!
【解决方案2】:

这是我能够让它工作的唯一方法。然而,我觉得它的效率极低,希望有人能让我走上一条更好的方法来做到这一点。以下是我想要实现的目标。

Sub displayForm(ByVal aForm As Form)

   Dim myFormName As String = ""

   If Cabinet.Contains(aForm) Then

       Dim indexOfCab As Integer = Cabinet.IndexOf(aForm)
       Dim ObjForm As Form = Cabinet.Item(indexOfCab)

       If aForm.IsDisposed Then

           Select Case indexOfCab

               Case 0
                   aForm = Nothing
                   aForm = New Form1
                   Cabinet.Item(indexOfCab) = aForm
                   Cabinet.Item(indexOfCab).Show()
               Case 1
                   aForm = Nothing
                   aForm = New Form2
                   Cabinet.Item(indexOfCab) = aForm
                   aForm.Show()
               Case 2
                   aForm = Nothing
                   aForm = New Form3
                   Cabinet.Item(indexOfCab) = aForm
                   Cabinet.Item(indexOfCab).Show()
           End Select

       Else
           Cabinet.Item(indexOfCab).Show()
       End If

   End If

结束子

【讨论】:

  • 我尝试用一​​些代码评论,但无法正常工作 - 请查看我的替代答案。
猜你喜欢
  • 2013-02-28
  • 2013-12-06
  • 2018-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多