2009-05-30 2 views
0

Ich habe ein Panel2 in einem geteilten Container, der mehrere Benutzersteuerelemente geladen hat. Panel 1 hat eine Exit-Schaltfläche, und ich möchte eine der Unterroutinen aufrufen, die sich in einer der in Panel2 geladenen Benutzersteuerelemente befinden.vb.net Aufruf einer Unterroutine auf einem Benutzersteuerelement

Private Sub btnExit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnExit.Click 
     Dim dialogMessage As DialogResult 
     Dim a As New ucTimeTracker 

    dialogMessage = MessageBox.Show("Are you sure you want to exit?", "Exit Ready Office Assistant?", _ 
    MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question) 

    If dialogMessage = Windows.Forms.DialogResult.Yes Then 

     ucTimeTracker.autoWriteFileOnExit() 
     Me.Close() 

    Else 
     Return 
    End If 

End Sub 

Diese Zeile gibt mir Ärger.

ucTimeTracker.autoWriteFileOnExit() 

Ich bekomme (Verweis auf nicht freigegebene Member erfordert eine Objektreferenz).

Ich möchte, dass die Exit-Taste auf frmMain.SplitContainer.Panel1 autoWriteFileOnExit() auf der Benutzersteuerung namens ucTimeTracker aufrufen, die in splitContainer.Panel2 geladen

Antwort

0

Sie ucTimeTracker werden mit dem Verfahren zu verweisen, die der Name der Klasse. Zu einem früheren Zeitpunkt in der Methode erstellen Sie eine Instanz dieser Klasse (Dim a As New ucTimeTracker). Sie sollten stattdessen a. autoWriteFileOnExit() aufrufen, wenn dies die Instanz ist, die Sie verwenden möchten. Wenn ucTimeTracker ein Steuerelement für das Formular ist, sollten Sie stattdessen den Namen dieses Steuerelements verwenden.

Um dies zu verstehen Sie den Unterschied zwischen statischen Mitglieder und Instanz Mitglieder verstehen müssen. Auf ein statisches Member kann direkt über die Klasse zugegriffen werden, ohne dass eine Instanz der Klasse erstellt werden muss. Um ein Instanzmitglied zu verwenden, benötigen Sie zuerst eine Instanz der Klasse. Sie können als ein Beispiel an der Int32-Klasse aussehen:

' call a static method in the Int32 class, that returns an Int32 instance' 
Dim asInt As Int32 = Int32.Parse("14") 
' call an instance method on the Int32 instance, that will act on the data in ' 
' that instance, returning a string representation of its value ' 
Dim asString As String = asInt.ToString() 

Typischerweise statische Methoden wirkt nicht auf Daten, die in der Klasse gehalten wird (obwohl dies nicht immer der Fall ist), sondern wirkt auf Daten an die Methoden übergeben durch Parameter. Instanzmethoden haben Zugriff auf die internen Daten dieser spezifischen Instanz und können auf diese Daten zugreifen (wie im obigen Beispiel).

1

Es scheint, dass Sie den Benutzersteuerungsklassenname ucTimeTracker anstelle des Instanznamens verwenden. Klicken Sie in der Entwurfsansicht auf das Benutzersteuerelement, und in der Eigenschaftenansicht befindet sich eine Eigenschaft "Name". verwenden Sie den Wert in der Eigenschaft namen (wahrscheinlich ucTimeTracker1) statt:

ucTimeTracker1.autoWriteFileOnExit() 
+1

Sie sollten sugeest er auch den Dim eine neue ucTimeTracker von seinem Code entfernt, da er nichts tut, aber zu Verwirrung. – pipTheGeek

+0

Richtig, lesen Sie den Kommentar von pipTheGeek;) –