Manchmal benötigt man schnell eine Daten-Klasse (DataFactory), die eine Zeile einer DataTable zurückgibt.
Natürlich mit schnellem Austausch der Daten gegenseitig und komfortablen Zugriff auf die Daten per Feldnamen.
Vorgehensweise:
1. Einmalig eine abstrakte Klasse erstellen, immer wieder verwendbar (hier: DataClass(Of T)).
2. Datenfeldnamen einer Tabelle in einer Enumerations festlegen.
3. Erstellung der Datenklasse (6 Zeilen) mit Inherits DataClass
und Verweis auf die Eunumeration.
' Erstellen der abstrakten Klasse
<Serializable()> Public MustInherit Class DataClass(Of T)
Implements IDisposable
Private Values As Dictionary(Of T, Object)
Private Columns As List(Of T)
Private m_ErrMsgDataRow As String = ""
Public Sub New()
Values = New Dictionary(Of T, Object)
Columns = New List(Of T)
Columns.AddRange(CType([Enum].GetValues(GetType(T)), _
Global.System.Collections.Generic.IEnumerable(Of T)))
End Sub
''' <summary>
''' Anzahl der Felder, die Datenwerte enthalten können
''' </summary>
''' <value></value>
''' <returns></returns>
''' <remarks></remarks>
ReadOnly Property Fields() As List(Of T)
Get
Return Columns
End Get
End Property
''' <summary>
''' Anzahl der Datenwerte
''' </summary>
''' <value></value>
''' <returns></returns>
''' <remarks></remarks>
ReadOnly Property CountValues() As Integer
Get
Return Values.Count
End Get
End Property
''' <summary>
''' überprüft ob alle Datenfelder einen Wert haben
''' </summary>
''' <value></value>
''' <returns></returns>
''' <remarks></remarks>
ReadOnly Property HasAllFieldsDatas() As Boolean
Get
Return CBool(Values.Count = Columns.Count)
End Get
End Property
''' <summary>
''' Gibt den Wert eines Elements zurück
''' </summary>
''' <param name="e"></param>
''' <returns></returns>
''' <remarks></remarks>
Public Function GetItem(ByVal e As T) As Object
Try
If Me.Values(e) Is Nothing Then Me.Values(e) = ""
Return Me.Values(e)
Catch : End Try
Return Nothing
End Function
''' <summary>
''' Setzt den Wert eines Elements
''' </summary>
''' <param name="Value"></param>
''' <param name="e"></param>
''' <remarks></remarks>
Public Sub SetItem(ByVal e As T, ByVal Value As Object)
Me.Values(e) = Value
End Sub
''' <summary>
''' Setzt die Daten einer Zeile in die Klasse um
''' </summary>
''' <param name="row"></param>
''' <remarks></remarks>
Public Sub Fill_Class(ByVal row As DataRow)
m_ErrMsgDataRow = ""
If row IsNot Nothing Then
For Each p As T In Columns
Try
SetItem(p, row(p.ToString))
Catch ex As Exception
m_ErrMsgDataRow += ex.Message + ControlChars.NewLine
End Try
Next
Exit Sub
End If
m_ErrMsgDataRow = "Datenobjekt ist Nothing."
End Sub
''' <summary>
''' Liest die Variablen in das DataRow ein
''' </summary>
''' <param name="row"></param>
''' <remarks></remarks>
Public Sub Fill_DataRow(ByVal row As DataRow, Optional ByVal AndAddToTable As Boolean = False)
m_ErrMsgDataRow = ""
If row IsNot Nothing Then
For Each p As T In Columns
Try
row(p.ToString) = GetItem(p)
Catch ex As Exception
m_ErrMsgDataRow += ex.Message + ControlChars.NewLine
End Try
Next
If AndAddToTable Then row.Table.Rows.Add(row)
Exit Sub
End If
m_ErrMsgDataRow = "Datenobjekt ist Nothing."
End Sub
''' <summary>
''' Gibt die Fehler zurück, die im Zusammenhang mit
''' einen DataRow-Objekt entstanden sind.
''' </summary>
''' <value></value>
''' <returns></returns>
''' <remarks></remarks>
ReadOnly Property ErrMsgFromDataRow() As String
Get
Return m_ErrMsgDataRow
End Get
End Property
#Region " IDisposable Support "
Private disposedValue As Boolean = False
Protected Overridable Sub Dispose(ByVal disposing As Boolean)
If Not Me.disposedValue Then
If disposing Then
Values = Nothing: Columns = Nothing
End If
' TODO: free your own state (unmanaged objects).
' TODO: set large fields to null.
End If
Me.disposedValue = True
End Sub
' This code added by Visual Basic to correctly implement the disposable pattern.
Public Sub Dispose() Implements IDisposable.Dispose
' Do not change this code. Put cleanup code in Dispose(ByVal disposing As Boolean) above.
Dispose(True)
GC.SuppressFinalize(Me)
End Sub
#End Region
End Class
' Datenfeldnamen festlegen
Public Enum FieldsKontoInfo
ID
KontoNr
Blz
Bank
Bez
Inhaber
Iban
Swift
DatumGesperrtAb
DatumErstelltAm
BetragStart
End Enum
' Erstellung der Datenklasse
' mit komfortablem Zugriff auf die Daten per Feldnamen
Public Class ClsKontoInfo
Inherits DataClass(Of FieldsKontoInfo)
Public Sub New()
MyBase.New()
End Sub
End Class
Kommentare zum Snippet