none
ComboBoxCell multicolores RRS feed

  • Pregunta

  • Buenas noches a todos, espero que el titulo sea lo suficientemente explicito para que entiendan lo que quiero hacer, en caso de que no, se los explico

    tengo un datagridview el cual tiene un comboboxcell el cual tiene 3 items y a esos tres items quiero cambiarle el backcolor al igual que lo hice con un comboboxnormal

    no se como hacer eso, alguien tiene una idea?

    • Cambiado Enrique M. Montejo domingo, 20 de septiembre de 2015 9:14 Pregunta relacionada con controles de Windows Forms.
    viernes, 18 de septiembre de 2015 0:52

Respuestas

  • Dim WithEvents combocell As ComboBox = New ComboBox
        Dim columnacombo As Integer = 1
        Dim headerclick As Boolean = False
    
    Private Sub Form1_Load(sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            combocell.DrawMode = DrawMode.OwnerDrawFixed
            combocell.FlatStyle = FlatStyle.Popup
            combocell.DropDownStyle = ComboBoxStyle.DropDownList
            AddHandler combocell.DrawItem, AddressOf combocell_DrawItem
            AddHandler combocell.SelectedIndexChanged, AddressOf combocell_SelectedIdexChanged
            combocell.Items.Add("")
            combocell.Items.Add("uno")
            combocell.Items.Add("dos")
            combocell.Items.Add("tres")
            DataGridView1.Columns.Item(clumnacombo).ReadOnly = True
            DataGridView1.Controls.Add(combocell)
            combocell.Location = DataGridView1.GetCellDisplayRectangle(columnacombo, 0, True).Location
            combocell.Size = DataGridView1.GetCellDisplayRectangle(columnacombo, 0, True).Size
        End Sub
    
     Private Sub combocell_DrawItem(sender As System.Object, e As System.Windows.Forms.DrawItemEventArgs) Handles combocell.DrawItem
            Select Case e.Index
                Case 0
                    'blanco
                    e.Graphics.FillRectangle(Brushes.White, e.Bounds.X, e.Bounds.Y, e.Bounds.Width, e.Bounds.Height)
                    e.Graphics.DrawString(combocell.Items(e.Index).ToString(), e.Font, New SolidBrush(Color.Black), e.Bounds)
                Case 1
                    'rojo
                    e.Graphics.FillRectangle(Brushes.Red, e.Bounds.X, e.Bounds.Y, e.Bounds.Width, e.Bounds.Height)
                    e.Graphics.DrawString(combocell.Items(e.Index).ToString(), e.Font, New SolidBrush(Color.Black), e.Bounds)
                Case 2
                    'amarillo
                    e.Graphics.FillRectangle(Brushes.Yellow, e.Bounds.X, e.Bounds.Y, e.Bounds.Width, e.Bounds.Height)
                    e.Graphics.DrawString(combocell.Items(e.Index).ToString(), e.Font, New SolidBrush(Color.Black), e.Bounds)
                Case 3
                    'verde
                    e.Graphics.FillRectangle(Brushes.LimeGreen, e.Bounds.X, e.Bounds.Y, e.Bounds.Width, e.Bounds.Height)
                    e.Graphics.DrawString(combocell.Items(e.Index).ToString(), e.Font, New SolidBrush(Color.Black), e.Bounds)
            End Select
        End Sub
    
        Private Sub combocell_SelectedIdexChanged(sender As System.Object, e As System.EventArgs) Handles combocell.SelectedIndexChanged
            DataGridView1.Item(columnacombo, DataGridView1.CurrentRow.Index).Value = combocell.Text
            If DataGridView1.Item(columnacombo, DataGridView1.CurrentRow.Index).Value = "uno" Then
                DataGridView1.Item(columnacombo, DataGridView1.CurrentRow.Index).Style.BackColor = Color.Red
                DataGridView1.Item(columnacombo, DataGridView1.CurrentRow.Index).Style.SelectionBackColor = Color.Red
                DataGridView1.Item(columnacombo, DataGridView1.CurrentRow.Index).Style.SelectionForeColor = Color.Black
            ElseIf DataGridView1.Item(columnacombo, DataGridView1.CurrentRow.Index).Value = "dos" Then
                DataGridView1.Item(columnacombo, DataGridView1.CurrentRow.Index).Style.BackColor = Color.Yellow
                DataGridView1.Item(columnacombo, DataGridView1.CurrentRow.Index).Style.SelectionBackColor = Color.Yellow
                DataGridView1.Item(columnacombo, DataGridView1.CurrentRow.Index).Style.SelectionForeColor = Color.Black
            ElseIf DataGridView1.Item(columnacombo, DataGridView1.CurrentRow.Index).Value = "tres" Then
                DataGridView1.Item(columnacombo, DataGridView1.CurrentRow.Index).Style.BackColor = Color.LimeGreen
                DataGridView1.Item(columnacombo, DataGridView1.CurrentRow.Index).Style.SelectionBackColor = Color.LimeGreen
                DataGridView1.Item(columnacombo, DataGridView1.CurrentRow.Index).Style.SelectionForeColor = Color.Black
            Else
                DataGridView1.Item(columnacombo, DataGridView1.CurrentRow.Index).Style.BackColor = Color.White
                DataGridView1.Item(columnacombo, DataGridView1.CurrentRow.Index).Style.SelectionBackColor = Color.White
                DataGridView1.Item(columnacombo, DataGridView1.CurrentRow.Index).Style.SelectionForeColor = Color.Black
            End If
            combocell.Visible = False
            DataGridView1.CurrentCell = DataGridView1.Item(7, DataGridView1.CurrentRow.Index)
            estatusgeneral()
        End Sub
    
        Private Sub DataGridView1_MouseDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles DataGridView1.MouseDown
            Dim ht As DataGridView.HitTestInfo
            ht = Me.DataGridView1.HitTest(e.X, e.Y)
                If ht.Type = DataGridViewHitTestType.RowHeader Or ht.Type = DataGridViewHitTestType.ColumnHeader Or ht.Type = DataGridViewHitTestType.VerticalScrollBar Then
                    headerclick = True
                    combocell.Visible = False
                Else
                    headerclick = False
                End If
        End Sub
    
        Private Sub DataGridView1_CellEnter(sender As Object, e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellEnter
            If headerclick = False Then
                If DataGridView1.CurrentCell.ColumnIndex = columnacombo Then
                    combocell.DroppedDown = False
                    combocell.Location = DataGridView1.GetCellDisplayRectangle(columnacombo, DataGridView1.CurrentRow.Index, True).Location
                    combocell.Visible = True
                    combocell.DroppedDown = True
                Else
                    combocell.Visible = False
                    combocell.DroppedDown = False
                End If
            Else
                headerclick = False
            End If
        End Sub

    El código esta casi para copiar y pegar, lo único que hay que cambiar son los strings de uno dos y tres del evento Load y el evento SelectedIdexChanged y obviamente los colores se deben de cambiar en caso de que no quieran verde amarillo y rojo y cambiar al principio el numero de columna donde quieran que aparezca el combobox multicolor en la variable columnacombo.

    si alguien necesita una mejor explicacion solo respondan este mensaje.

    • Editado RHCRD sábado, 10 de octubre de 2015 0:19
    • Marcado como respuesta RHCRD sábado, 10 de octubre de 2015 0:19
    sábado, 10 de octubre de 2015 0:16