Hallo,
ich fürchte, ohne genauen Code kann man da nicht viel sagen. Wenn du dir allerdings sicher bist, dass du in deiner Hauptform nicht auf sie selbst referenzierst, würde ich raten, dass du in einer der anderen Forms im Konstruktor auf die Defaultinstanz der Hauptform verweist. Wenn nun die Defaultinstanz der Hauptform erzeugt wird, erstellt diese im Konstruktor neue Instanzen der anderen Forms, und wenn diese wiederrum im Konstruktor auf die Hauptform verweisen, würde das zu der Exception führen.
Hier mal ein Beispiel mit einer Hauptform und einer Unterform, wobei die Hauptform als Defaultinstanz verwendet wird und wo es dann zur InvalidOperationException kommt:
Option Strict On
Public Class Hauptform
Private myUnterform As New Unterform() ' Hier wird die Unterform instanziert
Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) _
Handles Button1.Click
myUnterform.Show() 'Klick auf Button zeigt die Unterform an
End Sub
End Class Option Strict On
Public Class Unterform
Private myHauptform As Hauptform = Hauptform 'Zugriff auf Default-Instanz
' erzeugt die Exception
End Class Da in der Unterform im Konstruktor auf die Hauptform zugregriffen wird, während noch der Konstruktor der Hauptform ausgeführt wird, führt dies zu der InvalidOperationException.
Wenn du in den Unterforms auf die Hauptform zugreifen willst, solltest du den Unterforms im Konstruktor eine Referenz auf die Hauptform mitgeben:
Option Strict On
Public Class Hauptform
Private myUnterform As New Unterform(Me) ' Hier wird die Unterform
' instanziert und eine Referenz auf die Hauptform übergeben
Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) _
Handles Button1.Click
myUnterform.Show()
End Sub
End Class Public Class Unterform
Private myHauptform As Hauptform
Public Sub New(myHauptform As Hauptform)
InitializeComponent()
Me.myHauptform = myHauptform
End Sub
End Class Zitat: |  | Ich hatte dann versucht, die ganzen Instanziierungen in die Load-Prozedur des Hauptfensters zu packen. Wenn ich das aber mache, dann sagt VS sobald ich in einer anderen Prozedur das Form aufrufen will, dass die Variable nicht zugreifbar sei, da sie Private für die Load-Methode ist. Klar ist, sie ja auch, aber das kann ich nicht ändern, denn Public kann man laut VS innerhalb einer Methode nicht benutzen. |  |
Das verstehe ich jetzt nicht ganz. Auf Variablen, die innerhalb der Form global deklariert wurden (Public, Private, Protected, Friend oder Protected Friend) kann von jeder Sub innerhalb der Form zugegriffen werden, also auch vom Form_Load-Ereignis:
Option Strict On
Public Class Hauptform
Private myUnterform As Unterform
Private Sub Hauptform_Load(sender As System.Object, e As System.EventArgs) _
Handles MyBase.Load
myUnterform = New Unterform(Me) ' Hier wird die Unterform instanziert
End Sub
End Class
Beitrag wurde zuletzt am 10.02.12 um 16:06:15 editiert. |