Adressverwaltung mit .NET, Teil 2

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 Abb. 1 aussehen.

Abb. 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:

  • Wählen Sie den Menüpunkt Datei ( Neu ( Combine aus der Menüzeile.
  • Wählen Sie ein Verzeichnis für das neue Projekt aus.
  • Geben Sie WinAdress2 als Dateinamen für das neue Projekt ein.
  • Markieren Sie die Schablone Windows-Anwendung.
  • Klicken Sie auf Erstellen. (
  • 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:

  • Wechseln Sie in die Design-Ansicht des Formulars.
  • Klicken Sie mit der rechten Maustaste auf einen leeren Bereich des Formulars.
  • Wählen Sie den Menüpunkt Eigenschaften aus dem Kontextmenü.
  • Um die Titelzeile des Formulars zu ändern, geben Sie für die Eigenschaft Text den Wert Adressen ein.
  • ändern Sie die Eigenschaft Name des Formulars auf frmAdressen. (
  • 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:

  • Klicken Sie im unteren Register des SharpDevelop-Fensters auf die Lasche Projekte.
  • Klicken Sie im Projekt-Explorer auf den Eintrag MainForm.vb.
  • Betätigen Sie die Taste F2 und benennen Sie die Datei in frmAdressen.vb um. (
  • 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.

    Abb. 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 Abb. 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:

  • Wählen Sie den Befehl Ansicht/Projekte aus der Menüzeile.
  • Klicken Sie mit der rechten Maustaste auf das Projekt WinAdress2.
  • Wählen Sie den Befehl Hinzufügen/Neue Datei aus dem Kontextmenü.
  • Markieren Sie in dem sich öffnenden Dialog die Kategorie VB und die Schablone Klasse.
  • Geben Sie DataLayer als Namen der Klasse ein.
  • Klicken Sie auf die Schaltfläche Erstellen. (
  • 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

    Sie haben das Ende des frei verfügbaren Textes erreicht. Möchten Sie ...

    Workplace

    Jahresabonnement TestzugangOder haben Sie bereits Zugangsdaten? Dann loggen Sie sich gleich hier ein:

    Schreibe einen Kommentar