Skip to content

Tag Archives: .NET

SQL Server 2005 e suas transactions indecisas

15-Aug-07

Eu estava no trabalho hoje pela manhã quando de repente me deparo com a seguinte Exception: “The transaction is in doubt”.

WTF!? A transaction está em dúvida!? Mas como!? O que mais vamos ter daqui a pouco!? “The transaction is having a bad hair day” ou então “The transaction is thinking about its life”… E depois ainda dizem que programar não é divertido :)

The transaction is in doubt.

O que? Você não acredita!? Então veja a imagem acima e/ou ainda a documentação dessa Exception no site da própria Microsoft (MSDN).

jQuery e TableSorter sobre componentes .NET

03-Aug-07

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 essa semana 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 sua 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 o a sessão <thead> utilizada pelo TableSorter. Segue o código abaixo:


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<tFirstRow.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;
}

Isso 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… O funcionamento correto do TableSorter acabou me gerando outro problema, pois a minha tabela possuia backgrounds alternados 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. Para resolver agora o novo problema, eu desenvolvi um widget para trabalhar sobre o TableSorter. Segue o código abaixo:


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<tRows.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<tRows.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 uso futuros eu ainda criei uma terceira que executa para executar as duas funções anteriores para mim, e o código final acabou ficando assim:


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.

Botando para funcionar

Veja abaixo o exemplo da minha implementação, onde eu utilizo as funções acima juntamente com algumas outras configurações do TableSorter:


<script type="text/javascript">
    window.onload = function() { /* IE7 fix */
        var defaltOrder = [[ 2, 0 ]]
        jQueryTableSorter('dataGridId', {
            widgets:[ 'AlternatingRowStyle' ],
            sortInitialOrder:'asc',
            headers:{ 0:{ sorter:false } }
        }, defaultOrder)
    }
</script>

@todo unir essas funções para criar um plugin do plugin da jQuery :)

UPDATE: adicionado ao http://clientside.com.br/jquery-e-tablesorter-sobre-componentes-net/