Die Community zu .NET und Classic VB.
Menü

VB.NET-Tipp 0089: Databinding mit Combo/Listbox - KeyValuePair als Datenobjekt

 von 

Beschreibung

Die Klasse KeyValuePair(Of String, TValue) eignet sich sehr gut als einfaches generisches Datenobjekt: in der Key-Eigenschaft wird die "Beschriftung" gespeichert, in .Value können beliebige Daten untergebracht werden.
In diesem Tipp werden Arrays davon erzeugt, für Point, DockStyle, Color. Mit diesen Arrays wird per Databinding eingerichtet, dass je eine Combobox eines anderen Controls Eigenschaft steuert, also drei ComboBoxen steuern über die Datasourcen "Points", "DockStyles", "Colors" die Eigenschaften "Location", "Dock", "BackgroundColor" verschiedener Controls.

Schwierigkeitsgrad:

Schwierigkeitsgrad 2

Framework-Version(en):

.NET Framework 3.0, .NET Framework 3.5

.NET-Version(en):

Visual Basic 2008

Download:

Download des Beispielprojektes [12,98 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 2008
' Option Strict:    An
' Option Infer:     An
'
' Referenzen: 
'  - System
'  - System.Core
'  - System.Data
'  - System.Deployment
'  - System.Drawing
'  - System.Windows.Forms
'  - System.Xml
'
' Imports: 
'  - Microsoft.VisualBasic
'  - Microsoft.VisualBasic.ControlChars
'  - System
'  - System.Collections.Generic
'  - System.Data
'  - System.Drawing
'  - System.Linq
'  - System.Windows.Forms
'

' ##############################################################################
' ############################ frmComboBinding.vb ##############################
' ##############################################################################
Public Class frmComboBinding

    ''' <summary>
    ''' Erstellt aus 2 generischen Argumenten ein KeyValuePair(Of TKey, TValue).
    ''' Ermöglicht quasi kürzere Schreibweise des KeyValuePair-Konstruktors
    ''' </summary>
    Public Function BuildPair(Of TKey, TValue)(ByVal Key As TKey, _
        ByVal Value As TValue) As KeyValuePair(Of TKey, TValue)

        Return New KeyValuePair(Of TKey, TValue)(Key, Value)
    End Function

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

        ' "Beschriftete Punkte" erzeugen ...
        Dim Locations = New KeyValuePair(Of String, Point)() { _
            BuildPair("Mid", New Point(150, 75)), _
            BuildPair("TopLeft", New Point(0, 0)), _
            BuildPair("TopRight", New Point(300, 0)), _
            BuildPair("BottomLeft", New Point(0, 150)), _
            BuildPair("BottomRight", New Point(300, 150))}
        ' an Combobox binden ...
        With Me.ComboBox1
            .DisplayMember = "Key"
            .ValueMember = "Value"
            .DataSource = Locations
        End With
        ' ... und an Panel1.Location binden.
        Panel1.DataBindings.Add("Location", Locations, "Value")

        ' Die "beschrifteten Dockstyles" werden mit Linq aus der 
        '  DockStyle-Enumeration generiert
        Dim Tp = GetType(DockStyle)
        Dim Docks As KeyValuePair(Of String, DockStyle)() = _
            [Enum].GetValues(Tp).Cast(Of DockStyle) _
            .Select(Function(DS) BuildPair([Enum].GetName(Tp, DS), DS)) _
            .ToArray()
        ' Einrichtung der Bindungen praktischerweise ausgelagert
        KeyValueBind(Me.ComboBox2, Button1, Docks, "Dock")

        ' Das Generieren "beschrifteter Colors" aus der KnownColor-Enumeration 
        ' ist noch komplizierter, da ich die SystemColors und Color.Transparent 
        ' ausschließen will (letztere ist als BackColor nicht zulässig).
        Tp = GetType(KnownColor)
        Dim _Colors = [Enum].GetValues(Tp).Cast(Of KnownColor) _
            .Select(Function(KC) BuildPair([Enum].GetName(Tp, KC), _
                Color.FromKnownColor(KC))) _
            .Where(Function(P) Not (P.Value.IsSystemColor OrElse P.Value = _
                Color.Transparent)) _
            .ToArray()
        KeyValueBind(Me.ComboBox3, Panel1, _Colors, "BackColor")
    End Sub

    ''' <summary>
    ''' Verbindet die DataSource mit ListControl und TargetProperty des 
    ''' Target-Controls. Dadurch übernimmt das ListControl die Steuerung der 
    ''' TargetProperty
    ''' </summary>
    Private Sub KeyValueBind( _
            ByVal ListControl As ListControl, _
            ByVal Target As Control, _
            ByVal DataSource As System.Collections.IList, _
            ByVal TargetProperty As String)
        With ListControl
            .DisplayMember = "Key"
            .ValueMember = "Value"
            .DataSource = DataSource
        End With
        Target.DataBindings.Add(TargetProperty, DataSource, "Value")
    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.