Manfred Hoffbauer, Düsseldorf
Im ersten Teil dieses Beitrags haben Sie die Adressen aus einer Access-Datenbank in ein DataGrid-Steuerelement geladen. In diesem zweiten Teil steigen Sie tiefer in die Programmierung ein und erfahren, wie Sie Adressen aus einem Listensteuerelement auswählen und komfortabel in der Einzelansicht bearbeiten können.
Die folgenden Beispiele und Vorgehensweisen können Sie mit der kostenlosen Entwicklungsumgebung SharpDevelop nachvollziehen. Alternativ lässt sich der Programmcode natürlich auch in einem Microsoft-Visual-Studio.NET-Projekt verwenden.
Das Ziel dieses Beitrags ist ein Formular zur Eingabe und Bearbeitung von Adressen. Es enthält ein Listenfeld mit einer übersicht der Adressen. Jede einzelne Adresse kann mit der Maus angeklickt und bearbeitet werden. Auch das Hinzufügen und Löschen von Adressen ist implementiert. Das Formular soll wie in Bild 1 aussehen.
Bild 1: Formular zur Eingabe und Bearbeitung von Adressen
Zur Eingabe und Bearbeitung der Adressen legen Sie ein Formular mit Einzelsatzansicht an. Gehen Sie dazu wie folgt vor:
Das Formular benennen
SharpDevelop generiert den Programmcode für ein neues, leeres Formular und speichert ihn unter dem Namen MainForm.vb. Mit den Registern Quellcode und Design wechseln Sie zwischen der Ansicht des Programmcodes und der Anzeige des Formularentwurfs.
Um den Namen des Formulars zu ändern, gehen Sie wie folgt vor:
Beachten Sie, dass Sie mit dem Eigenschaftenfenster nur die Name-Eigenschaft des Formulars und die Titelzeile ändern können. SharpDevelop speichert den Programmcode weiterhin in der Datei MainForm.vb. Um den Namen der Formulardatei zu ändern, gehen Sie wie folgt vor:
Der ursprüngliche Name MainForm kommt jetzt immer noch als Klassenname innerhalb des Quellcodes vor. Falls Sie auch dies noch ändern wollen, müssen Sie die Zeile
Public Class MainForm
in
Public Class Adressen
umwandeln. Außerdem müssen Sie die Prozedur anpassen, die das Startformular der Anwendung instanziert:
Public Shared Sub Main Dim fAdressen As New Adressen fAdressen.ShowDialog() End Sub
Steuerelemente anordnen
Das Formular soll ein ListView-Steuerelement erhalten, das eine Liste aller Adressen anzeigt. Um die Liste anzulegen, klicken Sie am linken unteren Rand des SharpDevelop-Fensters auf die Registerlasche Tools. Markieren Sie in der Toolbox die Gruppe Windows Forms. Ziehen Sie dann das ListView-Steuerelement auf den Entwurfsbereich. Im Eigenschaftenfenster sollten Sie den Namen des Steuerelements auf lstvAdressen ändern.
Die weiteren Eigenschaften des ListView-Steuerelements können Sie so lassen wie sie sind. Sie werden später per Programmcode verändert. Zur Anzeige der Adressen in der Einzelansicht benötigen Sie die Label-Steuerelemente aus Tab. 1.
Label-Name |
Text |
lblAnrede |
Anrede |
lblVorname |
Vorname |
lblNachname |
Nachname |
lblStrasse |
Strasse |
lblPlzOrt |
PLZ/Ort |
lblTelefon |
Telefon |
lblTelefax |
Telefax |
Tab. 1: Diese Label-Steuerelemente sind erforderlich.
Die Anzeige und Bearbeitung der Daten erfolgt in Text- und Kombinationsfeldern. Tab. 2 enthält eine übersicht der erforderlichen Steuerelemente.
Name |
Steuerelementtyp |
cmbAnredeID |
ComboBox |
txtVorname |
TextBox |
txtNachname |
TextBox |
txtStrasse |
TextBox |
txtPLZ |
TextBox |
txtOrt |
TextBox |
txtTelefon |
TextBox |
txtTelefax |
TextBox |
Tab. 2: Diese Kombinations- und Textfelder sind erforderlich.
Bild 2: Die Abbildung zeigt die Steuerelemente zur Anzeige und Bearbeitung von Adressen.
Das Hinzufügen der Steuerelemente erfolgt über die Toolbox. Ordnen Sie die Steuerelemente stets paarweise so an, dass eine Einzelsatzansicht wie in Bild 2 entsteht.
Zum Test können Sie das Programm per F5-Taste starten. Sie werden dabei feststellen, dass es vollständig kompiliert und ausgeführt werden kann. Nur das Ergebnis ist vielleicht etwas ernüchternd. Sie erhalten ein Formular völlig ohne Funktionalität, das noch nicht einmal einen Datensatz anzeigen kann. Dies verdeutlicht einen wichtigen Unterschied zwischen Microsoft Access und einem .NET-Programm: Bei .NET müssen Sie jede einzelne Programmfunktion selbst programmieren. Wenn Sie also einen Datensatz anzeigen wollen, dann benötigen Sie zunächst einmal ein Programm, das per OleDB auf eine Access-Datenbank zugreift.
Die Routinen für den Datenzugriff sollen in der Klasse DataLayer zusammengefasst werden.
Zum Anlegen der Klasse gehen Sie wie folgt vor:
SharpDevelop erzeugt darauf eine neue Klassendatei und fügt diese dem aktuellen Projekt hinzu. Sie ersetzen den Programmcode vollständig durch eigenen Programmcode. Mit der ersten Anweisung importieren Sie den Namenspace System.Data.OleDb. Im Beitrag ADO.NET – eine Einführung in Ausgabe 5/2004 von Access im Unternehmen finden Sie weitere Details zum Namespace OleDb. Er enthält auf jeden Fall die für den Datenzugriff benötigten Objekte.
Die Prozedur New ist der Konstruktor der Klasse DataLayer. Der enthaltene Programmcode wird immer dann ausgeführt, wenn Sie ein neues Objekt dieser Klasse instanzieren. Der Konstruktor ist so definiert, dass die aufrufende Anweisung immer einen ConnectionString angeben muss. Die New-Prozedur weist den String einer Variablen zu, die von allen Methoden der Klasse verwendet werden kann.
Die DataLayer-Klasse implementiert das IDisposable-Interface. Die Implementation befindet sich in der Dispose()-Klasse. Sie schließt die Connection. Mit dieser Art der Implementierung erreichen Sie, dass die Connection per Dispose() von einer aufrufenden Methode und automatisch von der .NET-Runtime-Umgebung aufgerufen werden kann. Durch die Prüfung Not m_Cnn Is Nothing ist in jedem Fall sichergestellt, dass die Connection nur einmal geschlossen wird.
Imports System.Data.OleDb Public Class DataLayer Implements System.IDisposable Dim m_CnnString As String Dim m_Cnn As OleDbConnection Public Sub New(ByVal ConnectionString As String) m_CnnString = ConnectionString End Sub Public Sub Dispose() Implements System.IDisposable.Dispose If Not m_Cnn Is Nothing Then m_Cnn.Close() m_Cnn.Dispose() m_Cnn = Nothing End If End Sub Private Function OpenConnection() As OleDbConnection If m_Cnn Is Nothing Then m_Cnn = New OleDbConnection(m_CnnString) m_Cnn.Open() End If End Function
Quellcode 1
Public Function GetAnreden() As DataTable OpenConnection() Dim tblAnreden As New DataTable Dim sb As New System.Text.StringBuilder sb.Append("SELECT tblAnreden.* FROM tblAnreden ") Dim adp As New OleDbDataAdapter(sb.ToString(), _ m_Cnn) adp.Fill(tblAnreden) adp.Dispose() Return tblAnreden End Function
Quellcode 2
Die Funktion OpenConnection öffnet die Connection zu einer Access-Datenbank (s. Quellcode 1). Der Rückgabewert der Funktion ist das geöffnete OleDbconnection-Objekt.
Daten lesen
Auf der Basis des Connection-Objekts können die DataLayer-Funktionen direkt auf die Tabellen der Access-Datenbank zugreifen. Die Funktion GetAnreden öffnet die Connection (s. Quellcode 2). Das StringBuilder-Objekt ist ein performanter Weg für den Zusammenbau von Zeichenketten. Die Append-Methode fügt ganz einfach den als Parameter übergebenen String an die bestehende Zeichenkette an. Die so zusammengesetzte SELECT-Anweisung kann zum Auffüllen eines DataAdapter-Objekts verwendet werden. Die Rückgabe der gelesenen Anreden erfolgt in Form eines DataTable-Objekts.
Die GetAdressen-Funktion funktioniert genauso wie die GetAnreden-Funktion. Nur die SELECT-Anweisung ist etwas aufwändiger (s. Quellcode 3). Sie stellt eine relationale Beziehung zwischen tblAdressen und tblAnreden her. Das entstehende DataTable-Objekt enthält zusätzlich zu den Adressen ein Feld für die Anrede.
Adressen anlegen, ändern und löschen
Die AddAdress-Funktion verwendet ebenfalls ein StringBuilder-Objekt zur Bildung einer SQL-Anweisung (s. Quellcode 4). In diesem Fall handelt es sich um eine INSERT-INTO-Anweisung, die die Anlage eines neuen Datensatzes ermöglicht. Die Parameterliste der Funktion enthält eine Variable für jedes Feld, das an die tblAdressen-Tabelle angefügt werden soll.
Eine Besonderheit ist das Feld AnredeID. Wenn es den Wert 0 hat, dann soll dies als „keine Anrede“ interpretiert werden. In diesem Fall fügt die AddAdress-Funktion einen NULL-Wert in die Tabelle ein.
Auf die AddAdress-Funktion folgen die UpdateAddress- und die DeleteAdress-Funktionen.
Public Function GetAdressen() As DataTable OpenConnection() Dim tblAdressen As New DataTable Dim sb As New System.Text.StringBuilder sb.Append("SELECT tblAdressen.*, tblAnreden.Anrede FROM tblAnreden ") sb.Append("RIGHT JOIN tblAdressen ON tblAnreden.AnredeID = tblAdressen.AnredeID;") Dim adp As New OleDbDataAdapter(sb.ToString(), m_Cnn) adp.Fill(tblAdressen) adp.Dispose() Return tblAdressen End Function
Quellcode 3
Public Function AddAdress(ByVal AnredeID As Integer, ByVal Vorname As String, _ ByVal Nachname As String, ByVal Strasse As String, ByVal PLZ As String, _ ByVal Ort As String, ByVal Telefon As String, ByVal Telefax As String) As Int32 Dim sb As New System.Text.StringBuilder sb.Append("INSERT INTO tblAdressen ") sb.Append("(AnredeID, Vorname, Nachname, Strasse, PLZ, Ort, Telefon, Telefax) ") sb.Append("VALUES (") If AnredeID = 0 Then sb.Append("NULL, ") Else sb.Append(AnredeID.ToString() + ", ") End If sb.Append(Quote(Vorname) + ", ") sb.Append(Quote(Nachname) + ", ") sb.Append(Quote(Strasse) + ", ") sb.Append(Quote(PLZ) + ", ") sb.Append(Quote(Ort) + ", ") sb.Append(Quote(Telefon) + ", ") sb.Append(Quote(Telefax) + ") ") Execute(sb) End Function
Quellcode 4
Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...
den kompletten Artikel im PDF-Format mit Beispieldatenbank
diesen und alle anderen Artikel mit dem Jahresabo