pcfjkg
Goto Top

Property XYZ() As DataTable, Aufruf von anderer Klasse bringt Fehler

In einer Klasse ABC wird eine Datatable erzeugt, welche in mehreren Formularen genutzt werden soll. Gefunden habe ich bisher, dass diese Aufgabe über eine Property gelöst werden kann. Trotz Recherche im Netz (und gefundenen Beispielen) fehlt mir als "VBA-Mensch" offensichtlich ein grundlegender Zugang zu OOP.
In einer Klasse (keine Form-Klasse) wird eine Tabelle erzeugt und als Property veröffentlicht wie folgt (DR("D4") = 8 dient zum Test:

Public Class C_ABC

Public DTL As DataTable
Property XYZ() As DataTable
Get
Return DTL
End Get
Set(ByVal value As DataTable)
DTL = value
End Set
End Property

Function DynamischeTabelle()
Dim DR As DataRow
Dim i As Byte
' --- Erzeugen einer dynamischen Tabelle
XYZ = New DataTable("Tabellenbezeichnung")
For i = 1 To 10
DTL.Columns.Add("D" & i, System.Type.GetType("System.Byte"))
Next i
For i = 1 To 2
DR = DTL.NewRow()
DR("D4") = 8
DTL.Rows.Add(DR)
Next i
DTL.Dispose()

END CLASS

Nun soll das Formular F_Start den Inhalt von XYZ nutzen, hier zur Anzeige von DT.Rows(1)("D4").

Public Class F_Start

Private Sub Btn_Datatable_Click(sender As System.Object, e As System.EventArgs) Handles Btn_Datatable.Click
Dim CA As New C_ABC
Dim DT As DataTable

DT = CA.DTL
MsgBox(DT.Rows(1)("D4").ToString)
End Sub

End Class

Fehler: Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.

Wenn ich aber
CA.DynamischeTabelle () in einer Zeile vor DT = CA.DTL ausführe, funktioniert es.
Wo liegt das Problem ?

Vielen Dank für jede Hilfe

PCFJKG

Content-ID: 212045

Url: https://administrator.de/contentid/212045

Ausgedruckt am: 24.11.2024 um 04:11 Uhr

colinardo
colinardo 21.07.2013 aktualisiert um 11:26:05 Uhr
Goto Top
Hallo PCFJKG,
Das Problem ist bei deiner Klasse folgendes: wenn du ein Objekt deiner Klasse erzeugst ist die Datatable in deiner Klasse noch gar nicht erzeugt worden. Du musst also im Initializer(Public Sub New) deiner Klasse das Datatable-Objekt erzeugen damit es bei jedem erstellen eines neuen Objektes dieser Klasse automatisch erzeugt wird.

Public Sub New()
   DynamischeTabelle()
End Sub
Grüße Uwe
PCFJKG
PCFJKG 21.07.2013 um 11:52:14 Uhr
Goto Top
Hallo Uwe,
erst einmal danke für die schnelle Antwort. Die dynamische Tabelle wird beim Start des Projektes mit dem Aufruf --> CA.DynamischeTabelle () erzeugt.
Erst danach clicke ich auf den Btn_Datatable im Formular. Es sollte doch dann auf die Tabelleninhalte der Datatable DTL - erzeugt in der Klasse C_ABC - ein Zugriff möglich sein oder ?

Viele Grüße

PCFJKG
colinardo
colinardo 21.07.2013 um 12:04:00 Uhr
Goto Top
Du kannst der Property mit dieser Zeile keine Datatable zuweisen:
XYZ = New DataTable("Tabellenbezeichnung")  
Schreib stattdessen
DTL = New DataTable("Tabellenbezeichnung")  
Du gibst die Public Variable DTL ja schon im GET Handler der Property zurück.
PCFJKG
PCFJKG 21.07.2013 um 12:17:48 Uhr
Goto Top
Hallo Uwe, das habe ich verstanden, geändert und kann die Änderung ohne Fehler in C_ABC debuggen, Jetzt bleibt nur noch die Frage, warum der Aufruf von DTL aus dem Startformular (Public Class F_Start) noch immer den Fehler: ... Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt ... bringt.
Viele Grüße
PCFJKG
colinardo
colinardo 21.07.2013 um 12:46:21 Uhr
Goto Top
Das habe ich doch oben schon geschrieben ; wenn du schon im Initialize Handler der Klasse C_ABC deine Datatable erzeugst brauchst du in deiner Form das Datatable-Objekt nicht erst mit CA.DynamischeTabelle() erzeugen, da es dann schon beim erstellen eines Objektes der Klasse C_ABC automatisch mit erzeugt wird.
PCFJKG
PCFJKG 21.07.2013 um 13:00:14 Uhr
Goto Top
Hallo Uwe, erst einmal danke für Deine Geduld und vor allem Deine schnellen Antworten. Vermutlich habe ich mich auch nicht ganz klar ausgedrückt, denn die DTL wird in der Form nicht erzeugt (nach meinem Verständnis), sondern lediglich ein Verweis (ist das der richtige Begriff ?) für den Zugriff auf die bereits in der der Klasse C_ABC erstellte Tabelle . Im Form selbst steht nur

Private Sub Btn_Datatable_Click(sender As System.Object, e As System.EventArgs) Handles Btn_Datatable.Click

Dim CA As New C_ABC
Dim DT As DataTable

DT = CA.DTL

erstellt, um dann die Testausgabe mit

MsgBox(DT.Rows(1)("D4").ToString)

End sub

aufzurufen. Dann kommt halt leider die Fehlermeldung ...

Vielleich hast Du trotzdem Lust, noch einmal zu antworten, auf jeden fall ist Deine schnelle Hilfe super.

Viele Grüße
PCFJKG
colinardo
colinardo 21.07.2013 aktualisiert um 13:28:03 Uhr
Goto Top
Code sagt mehr als 1000 Worte ...
In deiner Klasse liegt doch einiges im Argen. Schreib das ganze so um dann klappt das auch:

back-to-topDeine Klasse C_ABC
Public Class C_ABC
    Private DTL As DataTable

    Public Sub New()
        DynamischeTabelle()
    End Sub

   Public Property XYZ() As DataTable
        Get
            Return DTL
        End Get
        Set(ByVal value As DataTable)
            DTL = value
        End Set
    End Property

    Private Sub DynamischeTabelle()
        Dim DR As DataRow
        Dim i As Byte
        ' --- Erzeugen einer dynamischen Tabelle  
        DTL = New DataTable("Tabellenbezeichnung")  
        For i = 1 To 10
            DTL.Columns.Add("D" & i, System.Type.GetType("System.Byte"))  
        Next i
        For i = 1 To 2
            DR = DTL.NewRow()
            DR("D4") = 8  
            DTL.Rows.Add(DR)
        Next i
    End Sub
End Class

und in deiner Form schreibst du folgendes:

   Private Sub Btn_Datatable_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Btn_Datatable.Click
        Dim CA As New C_ABC
        Dim DT As DataTable
        DT = CA.XYZ
        MsgBox(DT.Rows(1)("D4").ToString)  
    End Sub

Wenn du den Code durchsiehst wird der Aha-Effekt schon kommen...

p.s. Bitte verwende in Zukunft Tags für das Posten von Programm-Code, merci..

Sonnigen Sonntag noch
Uwe
PCFJKG
PCFJKG 21.07.2013 um 13:37:30 Uhr
Goto Top
Hallo Uwe, es hat sofort funktioniert. Was soll ich sagen außer noch einmal vielen Dank ! Auch Dir einen schönen Sonn- und weitere schöne tage.
Herzliche Grüße
PCFJKG
colinardo
colinardo 22.07.2013 um 09:18:11 Uhr
Goto Top
noch bitte als gelöst markieren. Merci.
PCFJKG
PCFJKG 22.07.2013 um 12:26:58 Uhr
Goto Top
Ist soeben erfolgt, sorry. Nochmals vielen Dank und Grüße von
PCFJKG