By Rogerio Mauri - 1/12/2011
Ivan... Boa Noite...
Utilizando a opção de agrupamento no ListView os grupos não ficam ordenados, mesmo definindo um Sort para o BO antes do Requery.
No evento RowPopulating: e.UseGroup = true; e.GroupHeaderText = ((vwTbCentralViagemAgendamentoBO)e.BusinessObject).NomeCidade.Trim() + "/" + ((vwTbCentralViagemAgendamentoBO)e.BusinessObject).SiglaUf;
Em um método para carregar o BO associado ao ListView: vwTbCentralViagemAgendamentoBO1.FillByData(dtViagem); vwTbCentralViagemAgendamentoBO1.Sort = "NomeCidade, SiglaUf, NomeCentralViagemLocalidade"; listView1.Requery();
No primeiro requery do listview (primeira vez que é carregado) o agrupamento sai ordenado. Depois, mudando a propriedade de seleção (no caso a data da viagem para selecionar outra agenda), o agrupamento fica desordenado. Fechando o formulário e voltando, na primeira vez, ordenado... mudando... sai fora de ordem. Um exemplo abaixo, para que você possa compreender:
Primeira vez: ARARAQUARA/SP José Antonio da Silva Maria Odete BEBEDOURO/SP Pedro da Silva Carlos Antonio
Segunda vez: BEBEDOURO/SP Pedro da Silva Carlos Antonio ARARAQUARA/SP José Antonio da Silva Maria Odete
Please...
|
By Ivan George Borges - 1/12/2011
Boa Noite Rogerio.
Você já experimentou já ordenar o seu BO no seu Fill method? No seu SELECT, já poderia usar um ORDER BY e ele já retornaria ordenado por cidade, seja qual for a data que estiver procurando. Assim não precisa nem usar o Sort no BO. Para dar uma opinião melhor, teria que ver seu código, mas quem sabe se fizer o que falei já resolve seu problema.
Abraços.
|
By Rogerio Mauri - 1/14/2011
Ivan... Boa Tarde...
Acho que encontrei o ponto do problema.
No código fonte do componente SFListView, método CreateListViewItem encontrei o seguinte código:
'-- Create a group name groupName = "grp" & rowEventArgs.GroupHeaderText.Replace(" ", "").Replace("'", "").Replace("-", "").Replace("""", "")
For Each group In Me.Groups If group.Name.Equals(groupName, StringComparison.OrdinalIgnoreCase) Then foundGroup = True Exit For End If Next
If Not foundGroup Then group = New ListViewGroup(rowEventArgs.GroupHeaderText) group.Name = groupName group.HeaderAlignment = rowEventArgs.GroupHeaderAlignment
If Not Me.Groups.Contains(group) Then Me.Groups.Add(group) End If End If
Observe que o GroupHeaderText está sendo utilizado para compor a propriedade Name da coleção Groups do ListView.
No meu caso eu estou utilizando uma "/" para separar o nome da cidade do estado e, com certeza, essa "/" está provocando o problema, pois ela não está na sequência de replaces utilizados para limpar caracteres inválidos da variável groupName.
Aqui, já resolvi, mas sugiro adicionar ao código de replaces do groupName mais opções para limpar a cadeia de caracteres do GroupHeaderText.
Outra sugestão seria criar uma propriedade nova no controle SFListView para que o desenvolvedor decidisse pela construção do 'name' do group, deixando o GroupHeaderText livre para a propriedade Text. Assim, saberiamos que a propriedade 'name' não aceita espaços e outros caracteres inválidos.
Sugestão: "GroupHeaderName".
Se essa propriedade for deixada em branco, o componente assumiria para Name do group o que está no GroupHeaderText (Isso irá garantir a compatibilidade com versões anteriores do SF). Assim, propondo o novo código na classe ListView.vb, método CreateListViewItem:
Código em C#:
// Create a group name groupName = rowEventArgs.GroupHeaderName.Trim().Length != 0 ? rowEventArgs.GroupHeaderName.Trim() : rowEventArgs.GroupHeaderText.Replace......;
Abraços...
|
By Rogerio Mauri - 1/14/2011
Ivan...
Fiz os testes retirando a barra, mas não deu certo... Continua apresentando problemas na ordenação, independente de configurados a ordenação por coluna no SFListView ou ordenação a partir da carga do BO (filldatatable).
Irei pesquisar mais, mas a situação é real.
|
By Ivan George Borges - 1/14/2011
Legal Rogerio.
Passo isto para a frente depois.
Abraços.
|
By Rogerio Mauri - 1/14/2011
Ivan... Achei...
No requery os grupos do ListView não são 'destruídos'....
Assim, na segunda chamada o ListView reaproveita os grupos já existentes ordenados de acordo com a sequência de construção da chamada anterior.
Por exemplo...
Na primeira chamada tenho as cidades de ARARAQUARA e BARRETOS...
- Os grupos são construídos na ordem, ficando assim: ARARAQUARA . Item 1 . Item 2 BARRETOS . Item 1 . Item 2
Na segunda chamada (por isso o problema não aparecida na primeira carga) tenho, no novo BO carregado, as cidades de AMERICO DE CAMPOS, ARARAQUARA...
- Os grupos são então montados errados. Pela lógica, AMERICO DE CAMPOS vem antes de ARARAQUARA. No entanto, como ARARAQUARA já foi criada no Requery anterior, ela ficará presa na sequência (e BARRETOS agora passará a existir na coleção, sem uso... consumindo recursos). Não sendo destruídos os grupos na entrada do Requery (listView1.Groups.Clear()), os registros são posicionados com agrupamento desordenado, ficando assim:
ARARAQUARA . Item 1 . Item 2 . Item 3 AMERICO DE CAMPOS . Item 1 . Item 2
Ficou claro ?
|
By Ivan George Borges - 1/14/2011
Opa, entendi sim. Com o Clear você resolveu a situação?
|
By Rogerio Mauri - 1/14/2011
Sim.. resolvido...
Mas, fica a sugestão para correção.
|
By Ivan George Borges - 1/14/2011
Combinado, passo para eles depois.
Legal que resolveu por aí.
|
By Rogerio Mauri - 3/23/2011
Ivan... Boa Noite...
Já temos uma atualização com essa correção?
|
By Ivan George Borges - 3/28/2011
Bom dia Rogerio.
Hmm... não sei. Por enquanto acho que ainda está na lista para revisão.
|
|