Start / Tipps / VB.NET-Tipp 0120: Objekt-Datenbindung
 
Startseite Up-/Download Tutorials Club Das Team
Rubriken Foren Bücher Tips 'n Tricks Suche


VB.NET-Tipp 0120: Objekt-Datenbindung


Häufig ist die ausgezeichnete Designer-Unterstützung für eine saubere Programmierung (nach dem Observer-Pattern) nicht bekannt. Ist auch schlecht vermittelbar, denn dem Code ist nicht anzusehen, was der Programmierer in den Designern gemacht hat.

Hier also das "Koch-Rezept" des angebotenen Downloads: Eine hierarchische Datenstruktur aus 2 Datenobjekten (State und City). Die Beziehung zwischen State und City ist implementiert, indem State eine Liste von City-Objekten hält (jeder Staat enthält mehrere Städte). Kompilieren, und dann im Datenfenster (Menu "Daten"-"DatenQuellen") daraus eine "Objekt-Datenquelle" generieren (bzw. ToolstripButton "neue Datenquelle hinzufügen" - "Objekt"). Im Datenfenster das State-Objekt auf "Details" umstellen (auf den Dropdown-Pfeil klicken). Vom Datenfenster das State-Objekt aufs Form ziehen Im Datenfenster State-Knoten öffnen, das untergeordnete City-Objekt auf "Details" umstellen. Dieses untergeordnete City-Objekt aufs Form. Generierten Bindingnavigator (schleunigst!) wieder entfernen, generierte Bindingsources da lassen. Listbox "lstState" aufs Form, Datasource="StateBindingSource", DisplayMember="Name" einstellen. Listbox "lstCity" aufs Form, Datasource="CityBindingSource", DisplayMember="Name" einstellen.

Fertig ist ein Parent-Children-View der Relation State-City inklusive Datensatz-Einzelblatt-Funktionalität (für jedes Datenfeld eine Textbox). Änderungen per Textbox-Eintrag werden auch in die Datenobjekte übernommen, sofern die hinterlegte Property nicht readonly ist.

Schwierigkeitsgrad 2 .NET Framework 2.0, .NET Framework 3.0, .NET Framework 3.5 Visual Basic 2005, Visual Basic 2008
Download des Beispielprojektes Download des Beispielprojektes [15,21 KB]
 
' Dieser Quellcode stammt von http://www.activevb.de
' und kann frei verwendet werden. Für eventuelle Schäden
' wird nicht gehaftet.

' Um Fehler oder Fragen zu klären, nutzen Sie bitte unser Forum.
' Ansonsten viel Spaß und Erfolg mit diesem Source!

' Projektversion:   Visual Studio 2005
' Option Strict:    An
'
' Referenzen: 
'  - System
'  - System.Drawing
'  - System.Windows.Forms
'  - System.Xml
'
' Imports: 
'  - Microsoft.VisualBasic
'  - Microsoft.VisualBasic.ControlChars
'  - System
'  - System.Collections.Generic
'  - System.Drawing
'  - System.Diagnostics
'  - System.Windows.Forms
'

' ##############################################################################
' ################################## City.vb ###################################
' ##############################################################################
Public Class City

    Private _Name As String
    Private _Inhabitants As Integer

    Public Sub New()
    End Sub

    Public Sub New(ByVal Name As String, ByVal Inhabitants As Integer)
        _Name = Name
        _Inhabitants = Inhabitants
    End Sub

    Public Property Name() As String
        Get
            Return _Name
        End Get
        Set(ByVal value As String)
            _Name = value
        End Set
    End Property

    Public Property Inhabitants() As Integer
        Get
            Return _Inhabitants
        End Get
        Set(ByVal NewValue As Integer)
            _Inhabitants = NewValue
        End Set
    End Property

End Class


' ##############################################################################
' ########################## frmObjectDatabinding.vb ###########################
' ##############################################################################
Public Class frmObjectDatabinding

    Private Sub frmObjectDatabinding_Load(ByVal sender As Object, _
        ByVal e As EventArgs) _
        Handles MyBase.Load

    ' Nur die StateBindingSource mit einer korrekten Datenstruktur befüllen - 
    '  alles andere machen die im Designer eingerichteten Objekte
    Const MaxCount As Integer = 1000000
    Dim Rnd As New Random '(als Einwohnerzahlen nehme ich Zufallszahlen)
    With New State("Germany")
        With .Cities
        .Add(New City("Hamburg", Rnd.Next(1, MaxCount)))
        .Add(New City("Stuttgart", Rnd.Next(1, MaxCount)))
        .Add(New City("Berlin", Rnd.Next(1, MaxCount)))
        .Add(New City("Bonn", Rnd.Next(1, MaxCount)))
        End With
        .AddTo(Me.StateBindingSource)
    End With
    With New State("France")
        With .Cities
            .Add(New City("Paris", Rnd.Next(1, MaxCount)))
            .Add(New City("Orleans", Rnd.Next(1, MaxCount)))
            .Add(New City("Nancy", Rnd.Next(1, MaxCount)))
            .Add(New City("Strasbourg", Rnd.Next(1, MaxCount)))
        End With
        .AddTo(Me.StateBindingSource)
    End With
    With New State("England")
        With .Cities
            .Add(New City("London", Rnd.Next(1, MaxCount)))
            .Add(New City("Bristol", Rnd.Next(1, MaxCount)))
            .Add(New City("Cambridge", Rnd.Next(1, MaxCount)))
            .Add(New City("Hampshire", Rnd.Next(1, MaxCount)))
        End With
            .AddTo(Me.StateBindingSource)
        End With
    End Sub

End Class

' ##############################################################################
' ################################# State.vb ###################################
' ##############################################################################
Public Class State

    Private _Cities As New List(Of City)
    Private _Name As String

    Public Sub New()
    End Sub

    Public Sub New(ByVal Name As String)
        _Name = Name
    End Sub

    Public ReadOnly Property Cities() As List(Of City)
        Get
            Return _Cities
        End Get
    End Property

    Public Property Name() As String
        Get
            Return _Name
        End Get
        Set(ByVal value As String)
            _Name = value
        End Set
    End Property

    Public ReadOnly Property Inhabitants() As Integer
        Get
            For Each C As City In _Cities
                Inhabitants += C.Inhabitants
            Next
        End Get
    End Property

    Public Sub AddTo(ByVal Src As System.ComponentModel.IBindingList)
        Src.Add(Me)
    End Sub

End Class

Ihre Meinung

Falls Sie Fragen zu oder Erfahrungen mit diesem Tipp haben, dann sollten Sie diese hier posten. Für alles weitere melden Sie sich bitte in einem zum Thema passendem Forum.

Falls Sie in ihren Kommentar Quellcode einbinden wollen, verwenden Sie bitte Pseudotags: Quellcode Bei VB.NET wird durch ein vorangestelltes [dotnet] markiert und durch [/dotnet] abgeschlossen.

Ihr Name:   
Ihre E-Mailadresse:   
 
Bitte folgende Kontrollnummer eingeben: 2727
Kontrolle:   
 
Ihre Frage/Ihr Kommentar:
Ja, ich möchte weitere Beiträge per E-Mail erhalten
Von ActiveVB-Notizservice am 01.01.2002 um 00:01
Bisher wurden noch keine Notizen zu dieser Seite gepostet.

Erstellt: 04.03.2009
Aktualisierung: 26.07.2010
  Autor: Spatzenkanonier
E-Mail: Tipps@ActiveVB.de



Copyright © 1998-2010 by ActiveVB
Alle Rechte vorbehalten.