2012-08-26 38 views
0

我一直非常感興趣,因爲後期的界面和進一步定製它們的能力超出了使用它們的默認狀態。使用通用列表(表單),收集對象的名稱屬性

我一直在研究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

撕開這個爲我打開的人。謝謝。

+0

好吧,我剛剛發現,如果我使用CTYPE(myListObject,表)我可以訪問Form.text財產。如果有人有2美分,但我想聽到它。 – Ccorock

回答

2

你不能構造一個「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聲明。

+0

我喜歡這裏,但表格的資源仍然在使用中。這只是相同代碼的更大實例的摘錄。我需要能夠一次生存大約二十個這樣的對象。我不能讓許多表格看不見。儘管創意點。 – Ccorock

+0

這正是我正在尋找安迪!我已經在玩Activator.CreateInstance,我只是沒有嘗試Ctype aForm到一個表單。非常非常棒。布拉沃我的朋友,謝謝你! – Ccorock

0

這是我一直能夠得到它的唯一辦法。我覺得它效率極低,希望有人能讓我走上一條更好的方式來實現這個目標。下面是我想要實現的。

子displayForm(BYVAL可保存格式,如表格)

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 

末次

+1

我試着評論一些代碼,但無法讓它正常工作 - 請看看我的替代答案。 – andygjp

相關問題