Ir para conteúdo
Fórum Script Brasil
  • 0

Checkstate Em Checklistbox


.Andreia.

Pergunta

Pessoal, um probleminha que achei no caminho e to tentando resolver aqui mas não vai:

Tenho um checklistbox com 4 itens (vindos do BD) e um listview. Preciso usar o SetItemCheckState para saber quando seleciono varios no lvw:

- se todos tiverem um item em comum então CheckState.Checked

- se nenhum tiver um item em comum então CheckState.Unchecked

- se um tem um item e qualquer outro não então CheckState.Indeterminate

não sei se expliquei direito mas montando em layout seria:

clb/ [3 lvws selecionados]

1º / 1 - 1 - 0 = Indeterminate

2º / 1 - 1 - 1 = Checked

3º / 0 - 0 - 0 = Unchecked

4º / 0 - 0 - 1 = Indeterminate

Estava tentando por este codigo:

    for (int i = 0; i < clb.Items.Count; i++) {

        if ((i % 2) == 0) {

            if ((i % 4) == 0)
                clb.SetItemCheckState(i, CheckState.Indeterminate);
            else
                clb.SetItemChecked(i, true);
        }
    }

Mas não está saindo certo, acredito que a ideia seja usando um E Lógico mas tá cruel.

alguém tem ideia?

vls

Link para o comentário
Compartilhar em outros sites

9 respostass a esta questão

Posts Recomendados

  • 0

Acho que seria isso aqui:

            int n;

            foreach (ListViewItem item in lvw.Items)
            {
                n = item.Index;
                
                if (item.Checked & lvw2.Items[n].Checked & lvw3.Items[n].Checked)
                    clb.SetItemChecked(n, true);
                else if (item.Checked | lvw2.Items[n].Checked | lvw3.Items[n].Checked)
                    clb.SetItemCheckState(n, CheckState.Indeterminate);
                else
                    clb.SetItemChecked(n, false);
            }

Considerando que os nomes das ListViews são "lvw", "lvw2" e "lvw3", e que o nome da CheckedListBox é "clb".

Certo? ;)

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

Gray, só tenho um listview, não entendi esse seu exemplo com 3.

Só uma? Então eu não entendi o que é o "3 lvws selecionados" que você colocou aqui...

clb/ [3 lvws selecionados]

1º / 1 - 1 - 0 = Indeterminate

2º / 1 - 1 - 1 = Checked

3º / 0 - 0 - 0 = Unchecked

4º / 0 - 0 - 1 = Indeterminate

... e porque você tem três valores ao invés de apenas 1 (se é apenas 1 listview). Tem como você postar uma imagem do que você está falando? Acho que ficaria melhor de "visualizar".

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

Eu selecionei alguns itens do listview, do lado eu tenho o CheckListBox. O Item 1 está CheckState.Checked, ou seja, todos os itens selecionado tem em comum o item 1. O Item 2 e 4 estão CheckState.Indeterminate, ou seja, nem todos tem em comum o item 2. E o Item 3 está CheckState.Unchecked, ou seja, nenhum deles tem em comum o Item 3.

Seria isso o que eu preciso. Eu também tentei dessa forma, que não funcionou:

for (int i = 0; i < clb.Items.Count; i++)
{
int Aux = 0;
for (int j = 0; j < lvw.SelectedItems.Count; j++)
{

int ValorGuardado = Convert.ToInt32(lvw.Campo("Segmento"));
int Potencia = (int)Math.Pow(2, i);
int ELogico = ValorGuardado & ((int)Math.Pow(2,i));

if (Potencia == ELogico) Aux++;
}
if (Aux == 0)
{
clb.SetItemCheckState(i, CheckState.Unchecked);
}
else if (Aux == lvw.SelectedItems.Count)
{
clb.SetItemCheckState(i, CheckState.Checked);
}
else clb.SetItemCheckState(i, CheckState.Indeterminate);

}

só pra esclarecer, onde tem lvw.Campo("Segmento") nada mais é que o retorno do valor do BD que refere-se ao checkboxlist.

É meio complicado explicar porque esse segmento no bd é um numero, e esse numero é convertido em binario para saber a quais itens ele faz parte.

Link para o comentário
Compartilhar em outros sites

  • 0

Bom, está ficando mais fácil de entender, porém aquele é um exemplo real? Se for, e o Item 1 for a primeira coluna como eu imaginei, o que 3CRUSB20075, 3C16472, 3C16485A, 3C17304A, 3C17300A e 3C17302A tem em comum? Quando você diz Item 1, Item 2, Item 3 e Item 4 você está mesmo se referindo as quatro colunas?

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

O exemplo é real sim... vou detalhar mais. No meu listview eu tenho 7 campos que retornam do BD mas eu só mando exibir 4 (o restante somente para uso do codigo). Uma dessas colunas que fica invisivel pro usuario é o campo numerico chamado "segmento".

Eu montei aqui dois desenhos pra facilitar:

Esse aqui não é como está, só fiz pra ficar mais facil de explicar. então tem lá [item1, item2, item3 e item4] são do tipo bool.

Aqui é como funciona mesmo. Eu tenho somente um campo [segmento] ele representa os 4 itens ali de cima, em vez de eu ter 4 campos eu uso somente um e decifro ele em binario. 15 representa todos os 4 itens marcados (checados), o 0 significa nenhum e por ai vai... Jogo uma funçao que faz um E lógico pra saber quais 'os bits ligados'.

então na hra que o codigo abre, eu mando ele monta os 4 itens e pega o numero la do campo segmento, converter e marcar os check correspondentes...

ficou melhor assim? :) vlll gray

ps.: esqueci de comentar: [VS2005/C#]

Link para o comentário
Compartilhar em outros sites

  • 0

Ah, sim! Agora captei vossa mensagem! Resolvi o caso assim:

            List<bool[]> Itens = new List<bool[]>();
  
            foreach (ListViewItem item in lvw.SelectedItems)
            {
                bool[] itens = ToBool(int.Parse(item.SubItems[1].Text));
                Itens.Add(itens);
            }

            bool? r1 = Itens[0][0];
            bool? r2 = Itens[0][1];
            bool? r3 = Itens[0][2];
            bool? r4 = Itens[0][3];

            for (int i = 1; i < Itens.Count; i++)
            {
                if (r1 == Itens[i][0])
                    r1 = r1 & Itens[i][0];
                else
                    r1 = null;

                if (r2 == Itens[i][1])
                    r2 = r2 & Itens[i][1];
                else
                    r2 = null;

                if (r3 == Itens[i][2])
                    r3 = r3 & Itens[i][2];
                else
                    r3 = null;

                if (r4 == Itens[i][3])
                    r4 = r4 & Itens[i][3];
                else
                    r4 = null;
            }

            if (r1.HasValue)
                clb.SetItemChecked(0, r1.Value);
            else
                clb.SetItemCheckState(0, CheckState.Indeterminate);

            if (r2.HasValue)
                clb.SetItemChecked(1, r2.Value);
            else
                clb.SetItemCheckState(1, CheckState.Indeterminate);

            if (r3.HasValue)
                clb.SetItemChecked(2, r3.Value);
            else
                clb.SetItemCheckState(2, CheckState.Indeterminate);

            if (r4.HasValue)
                clb.SetItemChecked(3, r4.Value);
            else
                clb.SetItemCheckState(3, CheckState.Indeterminate);
E você vai precisar desta função aqui também:
        public bool[] ToBool(int n)
        {
            int resto;
            List<bool> binário = new List<bool>();

            do
            {
                resto = n % 2;
                binário.Add(Convert.ToBoolean(resto));
                n = n / 2;
            } while (n > 1);
            binário.Add(Convert.ToBoolean(n));
            if (binário.Count < 4)
                binário.AddRange(new bool[4 - binário.Count]);
            binário.Reverse();

            return binário.ToArray();
        }
Acredito que você só terá que alterar a linha...
                bool[] itens = ToBool(int.Parse(item.SubItems[1].Text));

... pois, no meu caso, item.SubItems[1].Text é de onde está vindo o "segmento".

Se você não conseguir implementar aí o código acima eu posso criar um projeto-exemplo pra ti.

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,2k
    • Posts
      651,9k
×
×
  • Criar Novo...