Barevné řádky v comboBoxu   zodpovězená otázka

VB.NET, WinForms

Nevíte prosím někdo, zda je možné nějákým jednoduchým způsobem označit řádky v comboboxu?

Našel jsem pouze tuto vlastnost:

Me.ComboBox1.BackColor = Color.Yellow

Ta provede podbravení celého comboboxu. Já bych ale potřeboval abych například řekl že itemy (řádky) s indexem 0-3 mají mít modré pozadí, 4-8 červené atd.

Na googlu jsem našel pár příkladů v C# ale nebylo to úplně to co bych potřeboval. Většinou to bylo vytvoření barevné palety a to ještě v nějáké staršé verzi .Netu

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Napadá mě jedině OwnerDraw, tedy buď vlastní vykreslování v události DrawItem, nebo vlastní vykreslování v metodě OnDrawItem ve zděděné třídě.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

http://www.codeguru.com/forum/showthread...

Odskúšané. Funguje.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

No trošku som to upravil. Nezabudnúť na properties pre ComboBox

DrawMode na OwnerDrawVariable

Public Class Form1
    Dim CurrentColor As Color
    Dim farba(10) As Color
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        farba(1) = Color.DarkCyan
        farba(2) = Color.Yellow
        farba(3) = Color.Red
        For i = 1 To 20
            ComboBox1.Items.Add(i)
        Next
    End Sub
    Protected Sub Combobox1_MeasureItem(ByVal sender As Object, ByVal e As System.Windows.Forms.MeasureItemEventArgs) Handles ComboBox1.MeasureItem
        'nahodna vyska poloziek
        Dim myRandom As New Random
        e.ItemHeight = myRandom.Next(25, 35)
    End Sub
    Protected Sub Combobox1_DrawItem(ByVal sender As Object, ByVal e As System.Windows.Forms.DrawItemEventArgs) Handles ComboBox1.DrawItem
        If e.Index < 0 Then
            e.DrawBackground()
            e.DrawFocusRectangle()
            Exit Sub
        End If
        ' vlastné farby
        CurrentColor = CType(farba(e.Index Mod 3 + 1), Color)

        ' get a square using the bounds height
        Dim SizeRect As Rectangle = New Rectangle(2, e.Bounds.Top + 2, e.Bounds.Width, e.Bounds.Height - 2)

        Dim ComboBrush As Brush

        ' call these methods first
        e.DrawBackground()
        e.DrawFocusRectangle()

        ' change brush color if item is selected
        If e.State = Windows.Forms.DrawItemState.Selected Then
            ComboBrush = Brushes.Yellow
        Else
            ComboBrush = Brushes.Green
        End If

        ' draw a rectangle and fill it
        e.Graphics.DrawRectangle(New Pen(CurrentColor), SizeRect)
        e.Graphics.FillRectangle(New SolidBrush(CurrentColor), SizeRect)

        ' draw a border
        SizeRect.Inflate(1, 1)
        e.Graphics.DrawRectangle(Pens.Red, SizeRect)

        ' draw the Color name
        e.Graphics.DrawString(ComboBox1.Items(e.Index), ComboBox1.Font, ComboBrush, e.Bounds.Height + 5, ((e.Bounds.Height - ComboBox1.Font.Height) \ 2) + e.Bounds.Top)

    End Sub

    Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged
        ComboBox1.BackColor = CurrentColor
    End Sub
End Class

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Děkuji, mne se po chvíli laborování podařilo dospět do podobného stádia nezávisle na tomto příspěvku i když zde to je více dotažené do konce:)

Děkuji za tento příspěvek:)

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Tak zde ještě přidávám mnou lehce upravený kód, třeba se někomu bude hodit.

    Protected Sub Combobox1_DrawItem(ByVal sender As Object, ByVal e As System.Windows.Forms.DrawItemEventArgs) Handles ComboBox1.DrawItem
        Dim CurrentColor As Color 'barva pozadí (nastavuju funkcí)
        Dim ComboBrush As Brush = Brushes.Black 'barva textu

        'pokud není žádný item vybraný vykreslím focus a ukončím proceduru
        If e.Index < 0 Then
            e.DrawBackground()
            e.DrawFocusRectangle()
            Exit Sub
        End If


        ' vykreslí focus s jeho rámečkem
        e.DrawBackground()
        e.DrawFocusRectangle()


        'volám funkci které předám index položky která zavolala překreslení v závislosti na textu nastavím barvu
        CurrentColor = nastavitBarvu(e.Index)


        ' nastavím parametry obdélníku
        Dim SizeRect As Rectangle = New Rectangle(5, e.Bounds.Top + 2, e.Bounds.Width - 10, e.Bounds.Height - 4)

        ' vykreslim obrys obdélníku a vyplním ho
        e.Graphics.DrawRectangle(New Pen(CurrentColor), SizeRect)
        e.Graphics.FillRectangle(New SolidBrush(CurrentColor), SizeRect)



        ' vykreslím text
        e.Graphics.DrawString(ComboBox1.Items(e.Index), ComboBox1.Font, ComboBrush, e.Bounds.Height - 10, ((e.Bounds.Height - ComboBox1.Font.Height) \ 2) + e.Bounds.Top)


    End Sub



    Function nastavitBarvu(ByVal index As Integer)
'Funkce kterou nastavuji barvu pozadí v závislosti na textu

        If Me.ComboBox1.Items.Item(index).ToString = "1" Then
            Return (Color.FromName("SkyBlue"))
        ElseIf Me.ComboBox1.Items.Item(index).ToString = "2" Then
            Return (Color.FromName("PaleGreen"))
        ElseIf Me.ComboBox1.Items.Item(index).ToString = "3" Then
            Return (Color.FromName("Coral"))
        Else
            Return (Color.FromName("Window"))
        End If


    End Function

Je to můj první počin s vlastním vykreslováním grafiky, tak z toho mám docela radost:)

nahlásit spamnahlásit spam 2 / 2 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback