segunda-feira, 31 de agosto de 2009

Usando javascript para percorrer Repeater

Hoje entrei em uma situação na qual nunca tinha passado, me pediram para fazer uma função em javascript para percorrer os checkbox de um repeater e analisar se pelo menos um estava checado.
O único problema é que o Visual Studio gera código pra você sobrescrevendo o nome e o id que você deu quando se usa usercontrol, assim um name="chkPassenger" se tranformou em: mUsrMain_UsrWebCheckInPassengersByFlight1_rptPNRSegments_ctl00_rptPassengers_ctl02_chkPassenger,
tudo bem ele gerou um span com o name correto, mas eu queria encontrar diretamente o checkbox.
A solução foi escrever este código:

function GetAllCheckBox()
{
var count = 0;
var inputs = document.getElementsByTagName('input');
for(var i = 0; i < inputs.length; i++)
{
      if(inputs[i].type == 'checkbox' && inputs[i].name.indexOf('chkPassenger') != -1)
     {
            if(inputs[i].checked == true)
            {
                   count++;
                   break;
            }
     }
}

if(count == 0)
      return false;
return true;
}

O porque do return? Bem como este evento estava sendo gerado por um itemcommand ele estava dando postback e claro, se eu precisava fazer em javascript era justamente para evitar ele. Para cancelar um postback, adicione a seguinte propriedade no controle que gerará ele:

OnClienteClick="return GetAllCheckBox();"

Assim se retornar false ele cancelará o postback, caso contrário o postback ocorrerá normalmente.

terça-feira, 25 de agosto de 2009

Adicionando imagens no Crystal Report

Uma das coisas mais comuns a se fazer em software, é a possibilidade de fazer um resumo de vendas para que o usuário possa escolher entre salvar em diversos formatos ou então imprimir.
Para que isso seja feito com facilidade, Visual Studio possui além dos modelos de documentos da Microsoft, uma ferramenta poderosa chamada Crystal Report.
Infelizmente o Crystal Report não possui um campo mapeado para imagem, onde você possa adicionar apenas uma url e ele faça todo o trabalho para você. Você pode estar pensando "mas também o que mais ele quer?", porém isso é comum quando se trabalha com a classe Image do .NET.
Para realizar esse trabalho é necessário adicionar um array de bytes.

Em seu datasource crie um atributo byte[] por exemplo:

    public byte[] Image { get; set; }

Feito isso de um refresh no seu datasource no Crystal Report para que você possa visualizar o novo campo, após visualizado apenas arraste o novo campo para o report.

Adicione o namespace: using System.IO;

Agora para ler a imagem de seu disco adicione o seguinte código:

    FileStream stream = new FileStream(url, FileMode.Open, FileAccess.Read);
    BinaryReader reader = new BinaryReader(stream);
    suaClasse.Image = reader.ReadBytes(Convert.ToInt32(stream.Length));
    reader.Close();
    stream.Close();

Vincule o datasource do Crystal Report para uma lista de sua classe ou o seu dataset e então o Crystal Report poderá realizar o trabalho para você.