jQuery e TableSorter sobre componentes .NET
Se você trabalha com .NET já deve ter notado que o código HTML gerado pelo framework não é o que podemos chamar de “um código bem estruturado”. Apesar disso, até agora isso nunca tinha me causado nenhum problema… Porém há alguma tempo atrás eu tive que fazer alguns malabarismos para poder utilizar o plugin TableSorter 2.0 da biblioteca jQuery em um projeto da empresa onde trabalho. O que eu estava tentando fazer era aplicar o plugin sobre uma tabela gerada pelo componente DataGrid do framework. O problema ocorreu porque plugin utiliza as linhas do <thead> da sua tabela para organizar a ordenação, mas o componente .NET não adiciona essa sessão ao código HTML da tabela.
Habilitando o TableSorter
Depois de algum tempo procurando por soluções prontas (sem sucesso), eu implementei um código javascript para ser executado no evento onload da página que modifica a tabela adicionando a sessão <thead> utilizada pelo TableSorter. Segue o código abaixo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | function _jQueryTableSorter_SemanticTable(tableId) { var table = document.getElementById(tableId) if (table == null) return false if (table.tHead != null && table.tHead.rows.length < 0) return true table.tHead || table.createTHead() var tHead = table.tHead var tFirstRow = table.rows[0] var tHeadRow = tHead.insertRow(0) tHeadRow.className = tFirstRow.className for (var i=0;i<FirstRow.cells.length;i++) { var tHeadCell = tHeadRow.insertCell(tHeadRow.cells.length) tHeadCell.innerHTML = tFirstRow.cells[i].innerHTML tHeadCell.className = tFirstRow.cells[i].className } table.deleteRow(1); return true; } |
O código acima resolveu o meu problema fazendo com que o plugin da jQuery conseguisse identificar o header da tabela e a ordenasse corretamente. Então caso encerrado, certo? Errado… Pois o funcionamento correto do TableSorter acabou me gerando outro problema, pois a minha tabela possuia o background da linhas com cores alternadas e no momento ordenação, essa alternância ficava completamente bagunçada.
Habilitando a alternância de estilos
Novamente procurando por solução prontas, eu encontrei na documentação do plugin uma solução pronta para o problema, porém que não não sei porque cargas d’águas não funcionou comigo. E para resolver agora o meu mais novo problema, eu desenvolvi um widget para trabalhar sobre o TableSorter. Segue o código abaixo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | function _jQueryTableSorter_AddWidgets() { $.tablesorter.addWidget({ id: 'AlternatingRowStyle', format: function(table) { var tRows = table.tBodies[0].rows var classes = new Array; for (var i=0;i<Rows.length;i++) { var classExists = false for (var j=0;j<classes.length;j++) if (classes[j] == tRows[i].className) { classExists = true break } if (!classExists) classes.push(tRows[i].className) } for (var i=0;i<Rows.length;i++) tRows[i].className = classes[i%classes.length]; } }); } |
Agora sim, problema resolvido! O TablerSorter funcionando perfeitamente nos DataGrid’s do .NET Framework.
Juntando os caquinhos
Para facilitar a utilização posterior, eu ainda criei uma terceira função para executar as duas funções anteriores para mim, e o código final acabou ficando assim:
1 2 3 4 5 6 7 | function jQueryTableSorter(tableId, options, defaultOrder) { _jQueryTableSorter_SemanticTable(tableId) _jQueryTableSorter_AddWidgets() $('#' + tableId).tablesorter(options || null) if (defaultOrder != undefined) $('#' + tableId).trigger('sorton', [ defaultOrder ]); } |
E agora, basta aplicar as funções acima sobre um DataGrid para habilitar ordenação client-side.
Fazendo funcionar
Veja abaixo o exemplo da minha implementação, onde eu utilizo as funções acima juntamente com algumas outras configurações do TableSorter:
1 2 3 4 5 6 7 8 9 |
window.onload = function() { /* IE7 fix */
var defaltOrder = [[ 2, 0 ]]
jQueryTableSorter('dataGridId', {
widgets:[ 'AlternatingRowStyle' ],
sortInitialOrder:'asc',
headers:{ 0:{ sorter:false } }
}, defaultOrder)
} |
@todo unir essas funções para criar um plugin para o plugin
Fonte: http://arthurfurlan.org/blog/2007/08/03/jquery-e-tablesorter-sobre-componentes-dotnet/
Entry Details
Publicado em 14/01/2008 às 12:01 em Frameworks, Javascript, jQuery

[…] Client-side » jQuery e TableSorter sobre componentes .NET on 14-Jan-08 at 12:52 pm […]
Boa tarde!
Não entendi mto bem o lance do ie7 fix…
pq vc não usou o $(document).ready(function(){ … ? dá problema no ie7???
Diego Marques:
Isso mesmo! Eu não me lembro agora qual era o problema exatamente, mas lembro que não funcionava. Na época eu encontrei bastante documentação a respeito desse mesmo problema, inclusive encontrei essa solução em outro blog. Hoje eu procurei e não encontrei mais, portanto é provável que esse bug (seja da JQuery, seja do IE7) já esteja resolvido