VB.NET-Tipp 0120: Objekt-Datenbindung
von Spatzenkanonier
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: | 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: |
' 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.