.Andreia. Postado Junho 14, 2006 Denunciar Share Postado Junho 14, 2006 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.Indeterminatenão sei se expliquei direito mas montando em layout seria:clb/ [3 lvws selecionados]1º / 1 - 1 - 0 = Indeterminate2º / 1 - 1 - 1 = Checked3º / 0 - 0 - 0 = Unchecked4º / 0 - 0 - 1 = IndeterminateEstava 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 Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Graymalkin Postado Junho 15, 2006 Denunciar Share Postado Junho 15, 2006 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 Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 .Andreia. Postado Junho 15, 2006 Autor Denunciar Share Postado Junho 15, 2006 Gray, só tenho um listview, não entendi esse seu exemplo com 3. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Graymalkin Postado Junho 15, 2006 Denunciar Share Postado Junho 15, 2006 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 = Indeterminate2º / 1 - 1 - 1 = Checked3º / 0 - 0 - 0 = Unchecked4º / 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 Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 .Andreia. Postado Junho 15, 2006 Autor Denunciar Share Postado Junho 15, 2006 Oi Gray, eu não expressei bem, onde digo "3 lvws selecionados" seriam "3 itens do lvw selecionados". E também o 1 significa marcado e 0 não-marcado.Amanha vou postar uma imagem, pois hj não tenho aqui.obrigada ;) Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 .Andreia. Postado Junho 16, 2006 Autor Denunciar Share Postado Junho 16, 2006 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. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Graymalkin Postado Junho 16, 2006 Denunciar Share Postado Junho 16, 2006 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 Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 .Andreia. Postado Junho 16, 2006 Autor Denunciar Share Postado Junho 16, 2006 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 grayps.: esqueci de comentar: [VS2005/C#] Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Graymalkin Postado Junho 17, 2006 Denunciar Share Postado Junho 17, 2006 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 Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 .Andreia. Postado Junho 20, 2006 Autor Denunciar Share Postado Junho 20, 2006 Gray, eu guardei o seu codigo. Infelizmente nesse momento terei que parar de fazer a aplicação e fazer outra coisa.Assim que eu conseguir voltar no problema e/ou resolver, postarei aqui.muito obrigada pela ajuda, atencioso como sempre! ;) Citar Link para o comentário Compartilhar em outros sites More sharing options...
Pergunta
.Andreia.
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:
Estava tentando por este codigo:
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
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.