none
Como mudar a cor de fundo de um item selecionado em um Checklistbox? RRS feed

Respostas

  • Ola amigo boa tarde,

    Crie a uma classe que herde de CheckedListBox (abaixo exemplo), em seguida abra o designer.cs do seu form e altere a Instância do objeto do CheckedListBox de System.Windows.Forms.CheckedListBox para sua classe.

    class MeuCheckedListBox : CheckedListBox
        {
            protected override void OnDrawItem(DrawItemEventArgs e)
            {
                DrawItemEventArgs e2 =
                    new DrawItemEventArgs
                    (
                        e.Graphics,
                        e.Font,
                        new Rectangle(e.Bounds.Location, e.Bounds.Size),
                        e.Index,
                        e.State,
                        e.ForeColor,
                        this.CheckedIndices.Contains(e.Index) ? Color.Red : SystemColors.Window
                    );
    
                base.OnDrawItem(e2);
            }
        }

    Acima perceba que a cor do selecionado será vermelha (Color.Red). 

    No Designer.cs

    Altere a linha:

       this.checkedListBox1 = new System.Windows.Forms.CheckedListBox();

    para:

       this.checkedListBox1 = new MeuCheckedListBox();

    Espero ter ajudado!

    terça-feira, 27 de fevereiro de 2018 18:36
  •   

    Entendi, na verdade vc queria alterar a cor do "Highlight" do item selecionado, podemos tentar assim:

    1. Altere a classe MeuCheckedListBox:
        class MeuCheckedListBox : CheckedListBox
        {
            public int CurrentIndex { get; set; }
    
            protected override void OnDrawItem(DrawItemEventArgs e)
            {
                Color foreColor = Color.Black;
                Color backColor = Color.Red;
                DrawItemEventArgs e2 = new DrawItemEventArgs(e.Graphics,
                    e.Font, e.Bounds, e.Index, DrawItemState.None, foreColor, CurrentIndex == e.Index ? Color.Red : SystemColors.Window);
                base.OnDrawItem(e2);
            }
        }

     Depois crie dois eventos ao CheckedListBox:

           private void checkedListBox1_KeyDown(object sender, KeyEventArgs e)
            {
                var index = checkedListBox1.SelectedIndex;
                if (index < 0) return;
                checkedListBox1.CurrentIndex = e.KeyCode == Keys.Down || e.KeyCode == Keys.Right ? (index + 1) : e.KeyCode == Keys.Up || e.KeyCode == Keys.Left ? (index - 1) : index;
            }
    
    
           private void checkedListBox1_MouseMove(object sender, MouseEventArgs e)
            {
                var index = checkedListBox1.IndexFromPoint(e.X, e.Y);
                if (index < 0) return;
                checkedListBox1.CurrentIndex = index;
            }

    Veja se o comportamento está como o esperado, um abraço!


    • Editado Edson Loris quarta-feira, 28 de fevereiro de 2018 18:18
    • Marcado como Resposta Denis Valjean quinta-feira, 1 de março de 2018 09:46
    quarta-feira, 28 de fevereiro de 2018 18:16

Todas as Respostas

  • ninguém?
    segunda-feira, 26 de fevereiro de 2018 23:43
  • /*O for percorrerá cada item do seu CheckedListBox, e o If verificará um por um, se algum está selecionado. */
    /*O método CheckListBox.Items.Count retorna um valor igual ao número de items, e o "-1" como você ja deve saber tá ali porque os índices começam do zero.
    
    
    for( int i = 0; i <= seuChecklistBox.Items.Count - 1; i++ ) { 
            if( seuChecklistBox.Items[ i ].Selected == true) {  
                seuChecklistbox.Items[i].Color = Cor_que_voce_quer;
            }
          }


    Resumindo você precisa de um loop como um for ou foreach para encontrar items

    selecionados, daí quando encontrá-los basta mudar a propriedade color, ou backColor deles.

    Espero que ajude se der errado chama aqui de novo.

    Ajudando marcar como útil, caso tenha esclarecido sua dúvida marcar como resposta.

    Obrigado.





    terça-feira, 27 de fevereiro de 2018 14:00

  • /*O for percorrerá cada item do seu CheckedListBox, e o If verificará um por um, se algum está selecionado. */
    
    for( int i = 0; i <= seuChecklistBox.Items.Count - 1; i++ ) { 
            if( seuChecklistBox.Items[ i ].Selected == true) {  
                seuChecklistbox.Color = Cor_que_voce_quer;
            }
          }

    Resumindo você precisa de um loop como um for ou foreach para encontrar items

    selecionados, daí quando encontrá-los basta mudar a propriedades color, ou backColor deles.

    Espero que ajude se der errado chama aqui de novo.

    Ajudar marcar como útil, caso tenha esclarecido sua dúvida marcar como resposta.



    O problema é que a propriedade do checkedlistbox que muda de cor é a BackColor, que muda a cor de fundo. Eu quero só mudar a cor de fundo do item selecionado, que fica sempre em azul. Pelo que andei lendo precisaria criar uma classe herdada de CheckedListBox e alterar essa característica. Problema é que não sei como fazer isso. Seria como fazer um novo controle, acho.
    terça-feira, 27 de fevereiro de 2018 14:18
  • Ola amigo boa tarde,

    Crie a uma classe que herde de CheckedListBox (abaixo exemplo), em seguida abra o designer.cs do seu form e altere a Instância do objeto do CheckedListBox de System.Windows.Forms.CheckedListBox para sua classe.

    class MeuCheckedListBox : CheckedListBox
        {
            protected override void OnDrawItem(DrawItemEventArgs e)
            {
                DrawItemEventArgs e2 =
                    new DrawItemEventArgs
                    (
                        e.Graphics,
                        e.Font,
                        new Rectangle(e.Bounds.Location, e.Bounds.Size),
                        e.Index,
                        e.State,
                        e.ForeColor,
                        this.CheckedIndices.Contains(e.Index) ? Color.Red : SystemColors.Window
                    );
    
                base.OnDrawItem(e2);
            }
        }

    Acima perceba que a cor do selecionado será vermelha (Color.Red). 

    No Designer.cs

    Altere a linha:

       this.checkedListBox1 = new System.Windows.Forms.CheckedListBox();

    para:

       this.checkedListBox1 = new MeuCheckedListBox();

    Espero ter ajudado!

    terça-feira, 27 de fevereiro de 2018 18:36
  • Ola amigo boa tarde,

    Crie a uma classe que herde de CheckedListBox (abaixo exemplo), em seguida abra o designer.cs do seu form e altere a Instância do objeto do CheckedListBox de System.Windows.Forms.CheckedListBox para sua classe.

    class MeuCheckedListBox : CheckedListBox
        {
            protected override void OnDrawItem(DrawItemEventArgs e)
            {
                DrawItemEventArgs e2 =
                    new DrawItemEventArgs
                    (
                        e.Graphics,
                        e.Font,
                        new Rectangle(e.Bounds.Location, e.Bounds.Size),
                        e.Index,
                        e.State,
                        e.ForeColor,
                        this.CheckedIndices.Contains(e.Index) ? Color.Red : SystemColors.Window
                    );
    
                base.OnDrawItem(e2);
            }
        }

    Acima perceba que a cor do selecionado será vermelha (Color.Red). 

    No Designer.cs

    Altere a linha:

       this.checkedListBox1 = new System.Windows.Forms.CheckedListBox();

    para:

       this.checkedListBox1 = new MeuCheckedListBox();

    Espero ter ajudado!

    quase.. o item selecionado ainda continua azul..os itens marcados ficam vermelhos. Gostaria apenas que os itens selecionados (marcados ou não) ficassem em vermelho. Tentei alterar o código abaixo para selectedIndices mas não resolveu: o item selecionado continua azul, quando saio dele ele fica vermelho.
     this.CheckedIndices.Contains
    terça-feira, 27 de fevereiro de 2018 18:58
  •   

    Entendi, na verdade vc queria alterar a cor do "Highlight" do item selecionado, podemos tentar assim:

    1. Altere a classe MeuCheckedListBox:
        class MeuCheckedListBox : CheckedListBox
        {
            public int CurrentIndex { get; set; }
    
            protected override void OnDrawItem(DrawItemEventArgs e)
            {
                Color foreColor = Color.Black;
                Color backColor = Color.Red;
                DrawItemEventArgs e2 = new DrawItemEventArgs(e.Graphics,
                    e.Font, e.Bounds, e.Index, DrawItemState.None, foreColor, CurrentIndex == e.Index ? Color.Red : SystemColors.Window);
                base.OnDrawItem(e2);
            }
        }

     Depois crie dois eventos ao CheckedListBox:

           private void checkedListBox1_KeyDown(object sender, KeyEventArgs e)
            {
                var index = checkedListBox1.SelectedIndex;
                if (index < 0) return;
                checkedListBox1.CurrentIndex = e.KeyCode == Keys.Down || e.KeyCode == Keys.Right ? (index + 1) : e.KeyCode == Keys.Up || e.KeyCode == Keys.Left ? (index - 1) : index;
            }
    
    
           private void checkedListBox1_MouseMove(object sender, MouseEventArgs e)
            {
                var index = checkedListBox1.IndexFromPoint(e.X, e.Y);
                if (index < 0) return;
                checkedListBox1.CurrentIndex = index;
            }

    Veja se o comportamento está como o esperado, um abraço!


    • Editado Edson Loris quarta-feira, 28 de fevereiro de 2018 18:18
    • Marcado como Resposta Denis Valjean quinta-feira, 1 de março de 2018 09:46
    quarta-feira, 28 de fevereiro de 2018 18:16
  •   

    Entendi, na verdade vc queria alterar a cor do "Highlight" do item selecionado, podemos tentar assim:

    1. Altere a classe MeuCheckedListBox:
        class MeuCheckedListBox : CheckedListBox
        {
            public int CurrentIndex { get; set; }
    
            protected override void OnDrawItem(DrawItemEventArgs e)
            {
                Color foreColor = Color.Black;
                Color backColor = Color.Red;
                DrawItemEventArgs e2 = new DrawItemEventArgs(e.Graphics,
                    e.Font, e.Bounds, e.Index, DrawItemState.None, foreColor, CurrentIndex == e.Index ? Color.Red : SystemColors.Window);
                base.OnDrawItem(e2);
            }
        }

     Depois crie dois eventos ao CheckedListBox:

           private void checkedListBox1_KeyDown(object sender, KeyEventArgs e)
            {
                var index = checkedListBox1.SelectedIndex;
                if (index < 0) return;
                checkedListBox1.CurrentIndex = e.KeyCode == Keys.Down || e.KeyCode == Keys.Right ? (index + 1) : e.KeyCode == Keys.Up || e.KeyCode == Keys.Left ? (index - 1) : index;
            }
    
    
           private void checkedListBox1_MouseMove(object sender, MouseEventArgs e)
            {
                var index = checkedListBox1.IndexFromPoint(e.X, e.Y);
                if (index < 0) return;
                checkedListBox1.CurrentIndex = index;
            }

    Veja se o comportamento está como o esperado, um abraço!


    Funcionou! Muito obrigado!
    quinta-feira, 1 de março de 2018 09:47