2017-10-23 7 views
0

私はこのサイトで見つけたコードから色の選択コンボボックスを作成しましたが、今はコードを見つけることができません。色を描画する数値から名前付き色にコンボボックスを選択する方法

コード:

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 

私はこのようなコンボボックスを移入:

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 

私はint型としてデータベースに値を格納し、例えば黒になります-16777216。

これは、ユーザーがレポートをカスタマイズできるフォームの一部です。データベースに格納されているものに基づいて色を表示するために、データが読み込まれるときにコンボを更新したいと思います。私はこれをするように見えることはできません。

だから私はロードデータはHDI.Color = -16777216

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

と言うしかし、私は実際の色名を取得することはできません。次の作業はありません。

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) 

私はこのタスクに間違ったコンボボックスを使用していますか?それを動作させる方法はありますか?

私はフルカラーピッカーを提供したくなかった。なぜなら、彼らは多くの色を使わないので、私はそれをユーザーにとって単純なものにしようとしていた。私は色を半分に減らすかもしれません。

編集:漏れの問題を修正します。ここでは、 enter image description here

+0

[カラーピッカーコンボボックス](https://stackoverflow.com/a/25616698/719186)からコードを取得していると思います。あなたはあなたのコンボボックスに "文字列"を追加しているので、データベースに "文字列"を保存すると思います。 – LarsTech

+0

コードが漏れています。各項目に新しいフォントは必要ありません。 cboを目的のフォントに設定し、それを使用します。また、ブラシを配置する必要があります – Plutonix

+0

データベースに 'Color.ToArgb'値を格納する代わりに、KnownColor列挙値を保存してください。そうすれば、KnownColorを再作成してその名前にアクセスできます。 – TnTinMn

答えて

0

最後にそれを得たソリューションです:

プライベートサブcboColorPicker_DrawItem(オブジェクトとしてByVal送信者、DrawItemEventArgsとしてByVal e)は、テーブルの構造は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 

を処理します:

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 
関連する問題