Makale Özeti

System.Windows.Forms.ComboBox winform kontrolü içerdiği öğeleri(item) renklendirmemiz için hazır özellikler sunmaz. Bunun için DrawMode özelliğini DrawMode.Normal in dışında bir değer vermeliyiz.

Makale

renkli combobox

Winform da renkli ComboBox

System.Windows.Forms.ComboBox winform kontrolü içerdiği öğeleri(item) renklendirmemiz için hazır özellikler sunmaz. Bunun için DrawMode özelliğini DrawMode.Normal  in dışında bir değer vermeliyiz. Yani DrawMode.OwnerDrawFixed veya DrawMode.OwnerDrawVariable. Bu özellik ile combobox itemlarının işletim sistemi tarafından mı yoksa bizim tarafımızdan mı çizileceği belirlenir.Normal mode bu görevi işletim sistemine yükler, diğerleri ise bize. OwnerDrawVariable ile OwnerDrawFixed arasındaki fark ise ownerdrawvariable ın ComboBox ın MeasureItem eventini tetiklemesidir. Bu event ı handle eden bir method oluşturup ComboBox itemının boyutlarını belirleyebiliriz.

Şimdi ComboBox ımıza 0-100 arasında random veri yükleyelim. Sonra DrawMode özelliği OwnerDrawVariable yapalım. MeasureItem ile yüksekliğini arttıralım.DrawItem eventinde de 30 dan küçük değere sahip olan itemları kırmızı,diğerlerini ise ComboBox ın arkaplan renginde bırakalım.

Örnek Dosya : ColoredComboBox.zip (26,16 KB)

 

    Private Sub Form1_Load(ByVal sender As System.Object, _
    ByVal e As System.EventArgs) Handles MyBase.Load
        ComboBox1.DrawMode = DrawMode.OwnerDrawVariable
        BindData()
    End Sub
    Sub BindData()
        Dim rasgele As New Random
        Dim data As New ArrayList
        Dim ix As Integer = 0
        Do While (ix < 15)
            data.Add(rasgele.Next(0, 100))
            ix += 1
        Loop
        ComboBox1.DataSource = data
    End Sub
    Private Sub ComboBox1_DrawItem(ByVal sender As Object, _
    ByVal e As System.Windows.Forms.DrawItemEventArgs) _
    Handles ComboBox1.DrawItem
        eğer ComboBox nesnenizin ismi değişir ise
        kodlarda bir değişiklik yapmanız gerekmeyecek
        sender parametresi zaten ComboBox1 e referans etmektedir
        Dim cmb As ComboBox = CType(sender, ComboBox)
        If e.Index = -1 OrElse cmb Is Nothing Then
            Debug.WriteLine("çıktım :" & Now)
            Exit Sub olurda index gelmez ise
        End If
        If e.BackColor.ToArgb <> cmb.BackColor.ToArgb Then
            bu durumda combobox itemımız combobox1 in arkaplan renginde
            farklı bir renk ile renklendirilmelidir.
            buda mouse işaretçisinin öğenin üzerine geldiğinde
            öğenin mavi(windows ayarlarına göre değişir)
            renk olması durumudur
            e.Graphics.FillRectangle(New SolidBrush(e.BackColor), e.Bounds)
        Else
            bu durumda  itemlarımız bizim renklendirmemizi bekliyor
            Dim selectedBrush As Brush
            If CType(cmb.Items(e.Index), Integer) < 30 Then
                eğer değer 30 den küçük ise arkaplan rengi kırmızı olsun
                selectedBrush = New SolidBrush(Color.Red)
                e.Graphics.FillRectangle(selectedBrush, e.Bounds)
            Else
                diğer satırları combobox ın arkaplan rengi ile aynı yapıyoruz
                selectedBrush = New SolidBrush(cmb.BackColor)
                e.Graphics.FillRectangle(selectedBrush, e.Bounds)
            End If
        End If
        metnin size değerini 10 değerine yükseltmek için
        yeni bir Font nesnesi oluşturuyoruz
        Dim f As New Font(e.Font.FontFamily, 10, FontStyle.Bold, e.Font.Unit)
        metni yazıyoruz
        e.Graphics.DrawString(CType(cmb.Items(e.Index), String), f, _
        New SolidBrush(e.ForeColor), e.Bounds.X, e.Bounds.Y)
    End Sub
    Private Sub ComboBox1_MeasureItem(ByVal sender As Object, _
    ByVal e As System.Windows.Forms.MeasureItemEventArgs) _
    Handles ComboBox1.MeasureItem
        e.ItemHeight += 10
    End Sub
    Private Sub Button1_Click(ByVal sender As System.Object, _
    ByVal e As System.EventArgs) Handles Button1.Click
        BindData()
    End Sub