Combobox mit Farbauswahl - beim Laden Farbe aus Row als SelectedItem anzeigen

  • VB.NET
  • .NET (FX) 4.0

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von tragl.

    Combobox mit Farbauswahl - beim Laden Farbe aus Row als SelectedItem anzeigen

    Hallo zusammen.
    Ich lasse mir in einem Datensatz-Edit-Dialog eine ComboBox mit Farben füllen
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub AddColorsToCmb()
    2. cmbFarbe.DrawMode = DrawMode.OwnerDrawFixed
    3. cmbFarbe.ItemHeight = 20
    4. Dim sysType As Type = GetType(System.Drawing.Color)
    5. For Each prop In sysType.GetProperties
    6. If prop.PropertyType Is GetType(System.Drawing.Color) Then
    7. cmbFarbe.Items.Add(prop.Name)
    8. End If
    9. Next
    10. End Sub


    VB.NET-Quellcode

    1. Private Sub cmb_DrawItem(sender As Object, e As DrawItemEventArgs) Handles cmbFarbe.DrawItem
    2. If e.Index = -1 Then
    3. Exit Sub
    4. End If
    5. Dim sysBrush As Brush = New SolidBrush(Color.FromName(DirectCast(cmbFarbe.Items(e.Index), String)))
    6. e.Graphics.DrawRectangle(New Pen(Brushes.Black), e.Bounds.Left + 2, e.Bounds.Top + 2, 30, e.Bounds.Height - 5)
    7. e.Graphics.FillRectangle(sysBrush, e.Bounds.Left + 3, e.Bounds.Top + 3, 29, e.Bounds.Height - 6)
    8. e.Graphics.DrawString(DirectCast(cmbFarbe.Items(e.Index), String), cmbFarbe.Font, Brushes.Black, 35, e.Bounds.Top + 2)
    9. End Sub


    Das funzt auch einwandfrei. Ich hätte jetzt gerne noch, dass wenn ich den Dialog öffne, er mir die Farbe aus dem Datensatz anzeigt.
    Also ich wähle vorher aus z.B. "White", das wird so im Datensatz als String gespeichert. Beim Editieren des Datensatzes soll er mir auch White wieder als Farbe in der
    Combobox anzeigen. Wie stell ich das am geschicktesten an?

    Mit cmbFarbe.SelectedItem = Color.FromName(rw.Farbe) geht's leider nicht.

    LG
    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup:
    In der ComboBox sind Namen gespeichert. Von daher: cmbFarbe.SelectedItem = rw.Farbe, wenn rw.Farbe z.B. den Wert "Brown" hat, also ein Farbname ist.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    tragl schrieb:

    Ich lasse mir in einem Datensatz-Edit-Dialog eine ComboBox mit Farben füllen
    Dann lass Dir die ComboBox auch mit Farben füllen.
    Form mit ComboBox CbbColor und Label Label1:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    3. Me.InitColorBox()
    4. End Sub
    5. Private Sub InitColorBox()
    6. Dim cols = New Dictionary(Of Color, String)
    7. cols.Add(Color.Red, "Rot")
    8. cols.Add(Color.Green, "Grün")
    9. cols.Add(Color.Blue, "Blau")
    10. Dim binding = New BindingSource()
    11. binding.DataSource = cols
    12. Me.CbbColor.DisplayMember = "Value"
    13. Me.CbbColor.ValueMember = "Key"
    14. Me.CbbColor.DataSource = binding
    15. Me.CbbColor.SelectedIndex = 0
    16. End Sub
    17. Private Sub CbbColor_SelectedIndexChanged(sender As Object, e As EventArgs) Handles CbbColor.SelectedIndexChanged
    18. Me.Label1.BackColor = CType(Me.CbbColor.SelectedValue, Color)
    19. End Sub
    20. End Class

    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Da gefällt mit die Ursprungsvariante besser.
    Bilder
    • Result.png

      10,61 kB, 212×650, 56 mal angesehen
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    VaporiZed schrieb:

    Von daher: cmbFarbe.SelectedItem = rw.Farbe

    Danke, das Einfachste und naheliegendste hab' ich natürlich nicht probiert :S Ich teste heute abend mal :thumbup:

    @RodFromGermany: Ich wollte extra die Farbanzeige mit drin haben - das gefällt mir von daher schon ganz gut. Hier ging's nur um die Vorauswahl aus der Farbe, die als String im Datensatz hinterlegt ist. ;)
    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup:

    tragl schrieb:

    Ich wollte extra die Farbanzeige mit drin haben
    Die läuft bei mir irgend wie nicht:

    VB.NET-Quellcode

    1. Private Sub cmb_DrawItem(sender As Object, e As DrawItemEventArgs) Handles CbbColor.DrawItem
    2. If e.Index = -1 Then
    3. Exit Sub
    4. End If
    5. Dim col = CType(Me.CbbColor.SelectedValue, Color)
    6. Dim txt = CType(Me.CbbColor.SelectedItem, KeyValuePair(Of Color, String)).Value.ToString
    7. Dim sysBrush As Brush = New SolidBrush(col)
    8. e.Graphics.DrawRectangle(Pens.Black, e.Bounds.Left + 2, e.Bounds.Top + 2, 30, e.Bounds.Height - 5)
    9. e.Graphics.FillRectangle(sysBrush, e.Bounds.Left + 3, e.Bounds.Top + 3, 29, e.Bounds.Height - 6)
    10. e.Graphics.DrawString(txt, CbbColor.Font, Brushes.Black, 35, e.Bounds.Top + 2)
    11. End Sub
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hast Du vorher die Sub AddColorsToCmb aufgerufen?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @VaporiZed OK, da ging mein Vorschlag nach hinten los.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Allerdings könnte man beide Vorschläge ein wenig fusionieren und so DataBinding effektiv nutzen, um eine Auswahl per Farbe oder Namen zu ermöglichen.

    VB.NET-Quellcode

    1. Imports System.Drawing
    2. Public Class FrmMain
    3. Private ReadOnly ColorPacks As New ColorPackList
    4. Private Sub FrmMain_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    5. ColorPacks.Fill()
    6. PrepareComboBox()
    7. End Sub
    8. Private Sub PrepareComboBox()
    9. cmbFarbe.DataSource = ColorPacks
    10. cmbFarbe.DrawMode = DrawMode.OwnerDrawFixed
    11. cmbFarbe.ItemHeight = 20
    12. End Sub
    13. Private Sub cmb_DrawItem(sender As Object, e As DrawItemEventArgs) Handles cmbFarbe.DrawItem
    14. If e.Index = -1 Then Return
    15. Dim SelectedColorPack = DirectCast(cmbFarbe.Items(e.Index), ColorPack)
    16. Dim sysBrush = DirectCast(GetType(Brushes).GetProperty(SelectedColorPack.Name).GetValue(GetType(Brushes)), Brush)
    17. e.Graphics.FillRectangle(sysBrush, e.Bounds.Left + 2, e.Bounds.Top + 2, 30, e.Bounds.Height - 4)
    18. e.Graphics.DrawRectangle(Pens.Black, e.Bounds.Left + 2, e.Bounds.Top + 2, 30, e.Bounds.Height - 4)
    19. e.Graphics.DrawString(SelectedColorPack.Name, cmbFarbe.Font, Brushes.Black, 40, e.Bounds.Top + 4)
    20. End Sub
    21. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    22. cmbFarbe.SelectedItem = ColorPacks.GetByColor(Color.Aqua)
    23. End Sub
    24. Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
    25. cmbFarbe.SelectedItem = ColorPacks.GetByName("LawnGreen")
    26. End Sub
    27. End Class
    28. Friend Class ColorPackList : Inherits List(Of ColorPack)
    29. Friend Sub Fill()
    30. Dim sysType As Type = GetType(Color)
    31. For Each prop In sysType.GetProperties
    32. If prop.PropertyType Is GetType(Color) Then
    33. Add(New ColorPack With {.Name = prop.Name, .Color = DirectCast(prop.GetValue(sysType), Color)})
    34. End If
    35. Next
    36. End Sub
    37. Friend Function GetByName(Name As String) As ColorPack
    38. Return SingleOrDefault(Function(x) x.Name = Name)
    39. End Function
    40. Friend Function GetByColor(Color As Color) As ColorPack
    41. Return SingleOrDefault(Function(x) x.Color = Color)
    42. End Function
    43. End Class
    44. Friend Class ColorPack
    45. Property Name As String
    46. Property Color As Color
    47. End Class


    ##########

    Hab die DrawItem-Sub noch verbessert, damit man keine Disposable-Objects drin hat, die man disposen müsste.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VaporiZed“ ()