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
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 212045
Url: https://administrator.de/contentid/212045
Ausgedruckt am: 24.11.2024 um 04:11 Uhr
10 Kommentare
Neuester Kommentar
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.
Grüße Uwe
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
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.
Code sagt mehr als 1000 Worte ...
In deiner Klasse liegt doch einiges im Argen. Schreib das ganze so um dann klappt das auch:
und in deiner Form schreibst du folgendes:
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
In deiner Klasse liegt doch einiges im Argen. Schreib das ganze so um dann klappt das auch:
Deine 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
noch bitte als gelöst markieren. Merci.