Die Community zu .NET und Classic VB.
Menü

VB.NET-Tipp 0120: Objekt-Datenbindung

 von 

Beschreibung

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:

Schwierigkeitsgrad 2

Framework-Version(en):

.NET Framework 2.0, .NET Framework 3.0, .NET Framework 3.5

.NET-Version(en):

Visual Basic 2005, Visual Basic 2008

Download:

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 diesem Artikel haben oder Ihre Erfahrung mit anderen Nutzern austauschen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.