2017-10-23 1 views
0

Ich habe eine Farbauswahl Combobox aus irgendeinem Code, den ich auf dieser Seite gefunden habe, erstellt, obwohl ich den Code jetzt nicht finden kann.Wie man die Auswahl einer Combobox von einem numerischen Wert auf eine benannte Farbe einstellt

-Code, die Farben zeichnen:

Private Sub cboColorPicker_DrawItem(ByVal sender As Object, ByVal e As DrawItemEventArgs) Handles cboColor.DrawItem, cboBackground.DrawItem 

    Dim g As Graphics 
    Dim ItemBrush As Brush 
    Dim ItemColor As Color 
    Dim ItemFont As Font 
    Dim ItemName As String 
    Dim rect As Rectangle 


    g = e.Graphics 
    rect = e.Bounds 

    If e.Index >= 0 Then 
     'Get item color name 
     ItemName = CType(sender, ComboBox).Items(e.Index).ToString 

     'Get instance a font to draw item name with this style 
     ItemFont = New Font("Arial", 9, FontStyle.Regular) 

     'Get instance color from item name 
     ItemColor = Color.FromName(ItemName) 

     'Get instance brush with Solid style to draw background 
     ItemBrush = New SolidBrush(ItemColor) 

     'Draw the item name 
     g.DrawString(ItemName, ItemFont, Brushes.Black, rect.X, rect.Top) 

     'Draw the background with my brush style and rectangle of item 
     g.FillRectangle(ItemBrush, rect.X, rect.Y, rect.Width, rect.Height) 

    End If 

End Sub 

ich bevölkern die Combobox wie folgt aus:

Private Sub PopulateColorCombo(ByVal cbo As ComboBox) 

    cbo.Items.Add("Black") 
    cbo.Items.Add("Blue") 
    cbo.Items.Add("Lime") 
    cbo.Items.Add("Cyan") 
    cbo.Items.Add("Red") 
    cbo.Items.Add("Fuchsia") 
    cbo.Items.Add("Yellow") 
    cbo.Items.Add("White") 
    cbo.Items.Add("Navy") 
    cbo.Items.Add("Green") 
    cbo.Items.Add("Teal") 
    cbo.Items.Add("Maroon") 
    cbo.Items.Add("Purple") 
    cbo.Items.Add("Olive") 
    cbo.Items.Add("Gray") 

End Sub 

Ich speichere den Wert in der Datenbank als int, zum Beispiel schwarz wird -16777216.

Dies ist Teil eines Formulars, mit dem der Benutzer einen Bericht anpassen kann. Ich möchte die Combo aktualisieren, wenn Daten geladen werden, um die Farbe basierend auf dem anzuzeigen, was in der Datenbank gespeichert wurde. Ich kann das anscheinend nicht tun.

sagen also die Daten, die ich laden, wie HDI.Color = -16777216

Color.FromArgb(HDI.Color).ToString = "Color [A=255, R=0, G=0, B=0]" 
Color.FromArgb(HDI.Color).Name = "ff000000" 

Aber ich kann nicht die tatsächliche Farbe Namen. Keine der folgenden Arbeiten.

cboColor.SelectedIndex = cboColor.FindStringExact(Color.FromArgb(HDI.Color).ToKnownColor.ToString) 
cboColor.SelectedIndex = cboColor.FindStringExact(CType(Color.FromArgb(HDI.Color), Color).ToString) 
cboColor.SelectedIndex = cboColor.FindStringExact(System.Drawing.ColorTranslator.FromHtml(Color.FromArgb(HDI.Color).Name).ToString) 

Verwende ich die falsche Combobox für diese Aufgabe? Gibt es eine Möglichkeit, es zum Laufen zu bringen?

Ich wollte keinen Vollfarbwähler anbieten, weil sie nicht viele Farben verwenden werden, also habe ich versucht, es für die Benutzer einfach zu halten. Ich kann sogar die Farben um die Hälfte reduzieren.

EDIT: Beheben Sie die undichte Probleme.

Private Sub cboColorPicker_DrawItem (ByVal Absender als Gegenstand, ByVal e As DrawItemEventArgs) Griffe cboColor.DrawItem, cboBackground.DrawItem

Dim g As Graphics 
    Dim ItemColor As Color 
    Dim ItemName As String 
    Dim rect As Rectangle 


    g = e.Graphics 
    rect = e.Bounds 

    If e.Index >= 0 Then 
     'Get item color name 
     ItemName = CType(sender, ComboBox).Items(e.Index).ToString 

     'Get instance color from item name 
     ItemColor = Color.FromName(ItemName) 

     'Get instance brush with Solid style to draw background 
     Using ItemBrush = New SolidBrush(ItemColor) 

      'Draw the item name 
      g.DrawString(ItemName, DirectCast(sender, ComboBox).Font, Brushes.Black, rect.X, rect.Top) 

      'Draw the background with my brush style and rectangle of item 
      g.FillRectangle(ItemBrush, rect.X, rect.Y, rect.Width, rect.Height) 

     End Using 

    End If 

End Sub 

Tabellenstruktur: enter image description here

+0

ich vermute, Sie den Code aus [Color Picker Combo Box] bekam (https://stackoverflow.com/a/25616698/719186). Sie fügen Ihrer Combobox "Zeichenfolgen" hinzu, also würde ich denken, dass Sie nur die "Zeichenfolge" in Ihrer Datenbank speichern würden. – LarsTech

+0

Ihr Code ist undicht. Sie brauchen keine neue Schriftart für jeden Artikel. Stellen Sie die cbo auf die gewünschte Schriftart und verwenden Sie diese. Außerdem sollte der Pinsel entsorgt werden. – Plutonix

+0

Speichern Sie den Wert "Color.ToArgb" nicht in der Datenbank, sondern speichern Sie den KnownColor-Enum-Wert. Auf diese Weise können Sie die KnownColor neu erstellen und auf ihren Namen zugreifen. – TnTinMn

Antwort

0

Schließlich habe es, hier ist die Lösung :

Dim ActualColor As Color 
    Dim ColorToCheck As KnownColor 


    For Each ColorToCheck In [Enum].GetValues(GetType(KnownColor)) 
     ActualColor = Color.FromKnownColor(ColorToCheck) 
     If Not ActualColor.IsSystemColor And HDI.Color = ActualColor.ToArgb Then 
      cboColor.Text = ActualColor.Name 
      Exit For 
     End If 
    Next 
Verwandte Themen