none
Me añade image mal al combobox RRS feed

  • Pregunta

  • Hola estoy intentando agregar imagenes a un combobox y lo que me pasas es que me las monta una sobre otra y cuando lo consigo se ve mal y me repite el mismo nombre con los registros corespondientes

    Gracias

     Private Sub ComboBox4_DrawItem(sender As Object, e As DrawItemEventArgs) Handles ComboBox4.DrawItem
            e.DrawBackground()
            e.DrawFocusRectangle()
            
            If CheckedListBox1.Items.Item(0).ToString = "Lupulos" Then
                Dim img As Image = New Bitmap(ImageList1.Images(13), New Size(25, 25))
                e.Graphics.DrawImage(img, New PointF(e.Bounds.Left, e.Bounds.Top))
                For N_lupulo = 0 To Receta_Nueva.Dgv_Tabla_Lupulos.RowCount - 1
    
                    
                    e.Graphics.DrawString(String.Format(Receta_Nueva.Dgv_Tabla_Lupulos.Rows(N_lupulo).Cells(1).Value), e.Font, New SolidBrush(e.ForeColor) _
                            , e.Bounds.Left + 32, e.Bounds.Top)
                Next
            End If
        End Sub

    sábado, 28 de noviembre de 2015 11:04

Respuestas

  • De alguna forma tendría que ser capaz de identificar qué tipo de elemento estás dibujando.

    Es decir, cuando vas a dibujar un elemento del combobox tratas de saber qué tipo de elemento es comprobando que check está seleccionado. Si hay varios checks seleccionados no puedes saber a cual de los tipos corresponde.

    El elemento añadido al combobox debería tener información para obtener a partir de él a qué tipo corresponde.

    ¿Cómo añades los elementos al combobox?


    Píldoras .NET
    Artículos, tutoriales y ejemplos de código .NET

    Píldoras JS
    Artículos, tutoriales y ejemplos de código JavaScript, HTML5, CSS3, ...

    • Marcado como respuesta JETET domingo, 29 de noviembre de 2015 11:40
    domingo, 29 de noviembre de 2015 9:51
  • Prueba algo así, creo que te funcionará:

        Private Sub ComboBox4_DrawItem(sender As Object, e As DrawItemEventArgs) Handles ComboBox4.DrawItem
            If e.Index < 0 Then Return
            Dim texto As String = CType(sender, ComboBox).Items(e.Index).ToString()
    
            e.Graphics.DrawString(texto, e.Font, Brushes.Red, e.Bounds.X + 20, e.Bounds.Y)
            If Receta_Nueva.Dgv_Tabla_Lupulos.Rows.Cast(Of DataGridViewRow).Where(Function(r) r.Cells(1).Value = texto).Any() Then
                ' Es Lúpulo
                e.Graphics.DrawImage(Me.ImageList1.Images(13), e.Bounds.Left, e.Bounds.Top)
            ElseIf Receta_Nueva.Dgv_Tabla_Fermentables.Rows.Cast(Of DataGridViewRow).Where(Function(r) r.Cells(1).Value = texto).Any() Then
                ' Malta
                e.Graphics.DrawImage(Me.ImageList1.Images(14), e.Bounds.Left, e.Bounds.Top)
            End If
        End Sub
    


    Píldoras .NET
    Artículos, tutoriales y ejemplos de código .NET

    Píldoras JS
    Artículos, tutoriales y ejemplos de código JavaScript, HTML5, CSS3, ...

    • Marcado como respuesta JETET domingo, 29 de noviembre de 2015 11:40
    domingo, 29 de noviembre de 2015 11:15

Todas las respuestas

  • Claro, el problema es que estás mostrando la misma imagen y el mismo texto independientemente del elemento del combobox que se esté dibujando.

    El índice del elemento que se está dibujando lo puedes obtener con e.Index.

    Tienes un ejemplo de cómo hacerlo en:

    ComboBox con imágenes


    Píldoras .NET
    Artículos, tutoriales y ejemplos de código .NET

    Píldoras JS
    Artículos, tutoriales y ejemplos de código JavaScript, HTML5, CSS3, ...

    sábado, 28 de noviembre de 2015 11:20
  • ya tengo solucionado el problema ahora tengo otro que es 

    cuando señalo en el checkedlistbox1 lupulos me pone los nombre y el icono corespondiente y si señalo maltas tambien va bien

    El problema viene cuando señalo Lupulos y maltas me agrega todos los nombres hasta hay todo bien pero despues la imagen es de las maltas

     Private Sub ComboBox4_DrawItem(sender As Object, e As DrawItemEventArgs) Handles ComboBox4.DrawItem
            On Error Resume Next
            '' ''If e.Index <> -1 Then
            '' ''    e.Graphics.DrawImage(Me.ImageList1.Images(13), e.Bounds.Left, e.Bounds.Top)
            '' ''    e.Graphics.DrawString(ComboBox4.Items(e.Index).ToString(), e.Font, Brushes.Red, e.Bounds.X + 20, e.Bounds.Y)
            '' ''End If
            For i = 0 To (CheckedListBox1.Items.Count - 1)
                If CheckedListBox1.GetItemChecked(i) = True Then
                    If CheckedListBox1.Items.Item(i).ToString = "Lupulos" Then
                        If e.Index <> -1 Then
                            e.Graphics.DrawImage(Me.ImageList1.Images(13), e.Bounds.Left, e.Bounds.Top)
                            e.Graphics.DrawString(ComboBox4.Items(e.Index).ToString(), e.Font, Brushes.Red, e.Bounds.X + 20, e.Bounds.Y)
                            
                        End If
                    End If
                    If CheckedListBox1.Items.Item(i).ToString = "Maltas" Then
                        For N_fermentable = 0 To Receta_Nueva.DGV_Tabla_Fermentables.RowCount - 1
                            If Receta_Nueva.DGV_Tabla_Fermentables.Rows(N_fermentable).Cells(2).Value = "Grano" Then
                                e.Graphics.DrawImage(Me.ImageList1.Images(14), e.Bounds.Left, e.Bounds.Top)
                                e.Graphics.DrawString(ComboBox4.Items(e.Index).ToString(), e.Font, Brushes.Red, e.Bounds.X + 20, e.Bounds.Y)
                            End If
                        Next
                    End If
                End If
            Next
        End Sub

    sábado, 28 de noviembre de 2015 19:07
  • De alguna forma tendría que ser capaz de identificar qué tipo de elemento estás dibujando.

    Es decir, cuando vas a dibujar un elemento del combobox tratas de saber qué tipo de elemento es comprobando que check está seleccionado. Si hay varios checks seleccionados no puedes saber a cual de los tipos corresponde.

    El elemento añadido al combobox debería tener información para obtener a partir de él a qué tipo corresponde.

    ¿Cómo añades los elementos al combobox?


    Píldoras .NET
    Artículos, tutoriales y ejemplos de código .NET

    Píldoras JS
    Artículos, tutoriales y ejemplos de código JavaScript, HTML5, CSS3, ...

    • Marcado como respuesta JETET domingo, 29 de noviembre de 2015 11:40
    domingo, 29 de noviembre de 2015 9:51
  • Asier muchissimas gracias Conseguido no se si se podra simplificar

    Private Sub ComboBox4_DrawItem(sender As Object, e As DrawItemEventArgs) Handles ComboBox4.DrawItem
            On Error Resume Next
            
            If e.Index <> -1 Then
                For i = 0 To (CheckedListBox1.Items.Count - 1)
                    If CheckedListBox1.Items.Item(i).ToString = "Lupulos" Then
                        e.Graphics.DrawString(ComboBox4.Items(e.Index).ToString(), e.Font, Brushes.Red, e.Bounds.X + 20, e.Bounds.Y)
                        For N_lupulo = 0 To Receta_Nueva.Dgv_Tabla_Lupulos.RowCount - 1
                            If ComboBox4.Items(e.Index).ToString() = Receta_Nueva.Dgv_Tabla_Lupulos.Rows(N_lupulo).Cells(1).Value Then
                                e.Graphics.DrawImage(Me.ImageList1.Images(13), e.Bounds.Left, e.Bounds.Top)
                            End If
                        Next
                    End If
    
                    If CheckedListBox1.Items.Item(i).ToString = "Maltas" Then
                        e.Graphics.DrawString(ComboBox4.Items(e.Index).ToString(), e.Font, Brushes.Red, e.Bounds.X + 20, e.Bounds.Y)
                        For N_fermentable = 0 To Receta_Nueva.DGV_Tabla_Fermentables.RowCount - 1
                            If ComboBox4.Items(e.Index).ToString() = Receta_Nueva.DGV_Tabla_Fermentables.Rows(N_fermentable).Cells(1).Value Then
                                e.Graphics.DrawImage(Me.ImageList1.Images(14), e.Bounds.Left, e.Bounds.Top)
                                '
                            End If
                        Next
                    End If
    
                Next
            End If
        End Sub

    domingo, 29 de noviembre de 2015 10:57
  • Prueba algo así, creo que te funcionará:

        Private Sub ComboBox4_DrawItem(sender As Object, e As DrawItemEventArgs) Handles ComboBox4.DrawItem
            If e.Index < 0 Then Return
            Dim texto As String = CType(sender, ComboBox).Items(e.Index).ToString()
    
            e.Graphics.DrawString(texto, e.Font, Brushes.Red, e.Bounds.X + 20, e.Bounds.Y)
            If Receta_Nueva.Dgv_Tabla_Lupulos.Rows.Cast(Of DataGridViewRow).Where(Function(r) r.Cells(1).Value = texto).Any() Then
                ' Es Lúpulo
                e.Graphics.DrawImage(Me.ImageList1.Images(13), e.Bounds.Left, e.Bounds.Top)
            ElseIf Receta_Nueva.Dgv_Tabla_Fermentables.Rows.Cast(Of DataGridViewRow).Where(Function(r) r.Cells(1).Value = texto).Any() Then
                ' Malta
                e.Graphics.DrawImage(Me.ImageList1.Images(14), e.Bounds.Left, e.Bounds.Top)
            End If
        End Sub
    


    Píldoras .NET
    Artículos, tutoriales y ejemplos de código .NET

    Píldoras JS
    Artículos, tutoriales y ejemplos de código JavaScript, HTML5, CSS3, ...

    • Marcado como respuesta JETET domingo, 29 de noviembre de 2015 11:40
    domingo, 29 de noviembre de 2015 11:15
  • 1000 Gracias

    domingo, 29 de noviembre de 2015 11:40