domingo, 14 de fevereiro de 2010

Repeater dentro de Repeater (DataList dentro de DataList ou GridView dentro de GridView)

Pessoal, imagine a seguinte situação, você tem uma lista de um determinado objeto e cada objeto dessa lista tem uma propriedade que é uma lista de um determinado objeto e você precisa popular um Repeater, vamos dar nomes aos objetos, suponha que você tenha uma lista de professores e cada professor tem seus alunos, bem, alguns irão dizer, fácil, cada vez que o Repeater fizer um ItemDataBound basta fazer um busca novamente no banco de dados e listar o resultado, como sempre me deparo com essa situação e vira e mexe algum me pergunta se essa é a melhor maneira de fazer resolvi escrever um artigo.

É muito simples, se a sua coleção já vem populada basta você passar essa lista de objetos para o outro controle dentro do seu Repater (nesse caso outro Repeater), e isso será feito a cada ItemDataBound.

Classes

Temos as seguintes classes:

///

/// Classe mãe

///

public abstract class Pessoa

{

private string _nome = string.Empty;

public string Nome

{

get { return _nome; }

set { _nome = value; }

}

public Pessoa() { }

}

///

/// Professor implementa Pessoa

///

public class Professor : Pessoa

{

private string _materia = string.Empty;

public string Materia

{

get { return _materia; }

set { _materia = value; }

}

///

/// Um professor tem uma lista de alunos

///

private System.Collections.Generic.List<Aluno> alunos = new System.Collections.Generic.List<Aluno>();

public System.Collections.Generic.List<Aluno> Alunos

{

get { return alunos; }

set { alunos = value; }

}

public Professor(string nome, string materia, System.Collections.Generic.List<Aluno> alunos)

{

Nome = nome;

Materia = materia;

Alunos = alunos;

}

}

///

/// Aluno implementa Pessoa

///

public class Aluno : Pessoa

{

private string _turma = string.Empty;

public string Turma

{

get { return _turma; }

set { _turma = value; }

}

public Aluno(string nome, string turma)

{

Nome = nome;

Turma = turma;

}

}

WebForm

Agora que já conhecemos nossas classes vamos para a implementação disso em uma pagina.

Primeiro vamos criar um Repeater na pagina e dentro dele criaremos um segundo repeater, como no exemplo abaixo:

<asp:Repeater ID="ProfessorRepeater" runat="server" OnItemDataBound="ProfessorRepeater_ItemDataBound">

<ItemTemplate>

Professor:

<%# Eval("Nome") %>

<br />

Matéria:

<%# Eval("Materia") %>

<br />

Alunos:

<asp:Repeater ID="AlunoRepeater" runat="server">

<HeaderTemplate>

<table>

<tr style="font-weight: bold">

<td>

Nometd>

<td>

Cursotd>

tr>

HeaderTemplate>

<FooterTemplate>

table>

FooterTemplate>

<ItemTemplate>

<tr style="background-color: Gray">

<td>

<%# Eval("Nome") %>

td>

<td>

<%# Eval("Turma")%>

td>

tr>

ItemTemplate>

<AlternatingItemTemplate>

<tr style="background-color: Silver">

<td>

<%# Eval("Nome") %>

td>

<td>

<%# Eval("Turma") %>

td>

tr>

AlternatingItemTemplate>

asp:Repeater>

ItemTemplate>

<SeparatorTemplate>

<hr />

SeparatorTemplate>

asp:Repeater>

Atente para o detalhe que o repeater AlunoRepater está escrevendo as propriedades Nome (que vem de Pessoa) e turma (que é da classe Aluno), bom, mas isso não irá funcionar dessa maneira. Vejamos no code behind da pagina como é a implementação disso.

Code Behind

No PageLoad os objetos são criados e populados.

protected void Page_Load(object sender, EventArgs e)

{

Page.Title = "Repeater dentro de Repeater (DataList dentro de DataLista ou GridView dentro de GridView)";

// lista de alunos que será atribuída aos professores

List<Aluno> alunosEpaminondas = new List<Aluno>();

alunosEpaminondas.Add(new Aluno("Alan", "Sistemas da Informação"));

alunosEpaminondas.Add(new Aluno("Fabio", "Ciência da Computação"));

alunosEpaminondas.Add(new Aluno("Marcelo", "Desenvolvimento de Sistemas Web"));

// Só para não falar que os professores tem os mesmos alunos

List<Aluno> alunosAdolfo = new List<Aluno>();

alunosAdolfo.Clear();

alunosAdolfo.Add(new Aluno("Carol", "Análise de Sistemas"));

alunosAdolfo.Add(new Aluno("Bruno", "Banco de Dados"));

// lista de professores

List<Professor> professores = new List<Professor>();

professores.Add(new Professor("Epaminondas", "Gestão de Projetos", alunosEpaminondas));

professores.Add(new Professor("Adolfo", "Programação Orientação a Objetos", alunosAdolfo));

ProfessorRepeater.DataSource = professores; // define o DataSource do repeater como a lista de objetos professores

ProfessorRepeater.DataBind();

}

No controle ProfessorRepeater, no evento ItemDataBound que o controle AlunoRepeater é populado, veja como é simples fazer a conversão do item do repeater que é passado.

protected void ProfessorRepeater_ItemDataBound(object sender, RepeaterItemEventArgs e)

{

// verifica se o item é do tipo ItemType ou AlternatingItem, se não for retorna e não continua o processamento

if (e.Item.ItemType != ListItemType.Item && e.Item.ItemType != ListItemType.AlternatingItem) return;

// verifica se o objeto AlunoRepeater existe dentro do item

if (e.Item.Controls.Contains((Repeater)e.Item.FindControl("AlunoRepeater")))

{

// cria um objeto Repeater e define-o como o objeto AlunoRepeater do item

Repeater alunoRepeater = (Repeater)e.Item.FindControl("AlunoRepeater");

// converte o item (linha do repeater) para um professor e define a propriedade Alunos como DataSource do repeater

alunoRepeater.DataSource = ((Professor)e.Item.DataItem).Alunos;

alunoRepeater.DataBind();

}

}

Super simples e tranqüilo, não há segredos nisso, a grande sacada é não ter que conectar ao banco novamente apenas obter os outros objetos. É possível utilizar isso também na criação de menus, para exibir a notas fiscais e seus itens, pedidos e seus itens etc. bem, ai vai depender da necessidade de cada projeto.

Espero ter contribuído com esse artigo.

quarta-feira, 2 de dezembro de 2009

MP3 player com DirectX

Requisitos

Windows XP com framework 2.0 ou superior
DirectX
Visual Studio 2008 ou compatível

1º Instalar Microsoft DirectX SDK (June 2006) ou compatível

Vamos lá pessoal, algum dia na vida qualquer um aqui já tentou executar um MP3
utilizando .NET correto? Aí vamos lá e adicionamos um objeto SoundPlayer do namespace
System.Media, quando utilizávamos o método Play()! PAN! Não é possível executar o arquivo
pois o SoundPlayer não suporta o MP3. Utilizaremos o DirectX para nos auxiliar com isso, para
isso a primeiro que devemos fazer é baixar DirectX Software Development Kit no site do
Microsoft através do link
http://www.microsoft.com/downloads/details.aspx?FamilyID=1fd20df1-dec6-47d0-8bef-
10e266dfdab8&DisplayLang=en, apenas 443 MB.
No meu caso eu tive que executar um mp3 em um dashboard de Call Center, o cliente
queria colocar um telão no Call Center com (o gerente desse projeto foi mandado embora
antes da conclusão do projeto, então essa parte do telão não rolou... vai vendo rsrs) e toda vez
em que o nível de atendimento estava abaixo no mínimo aceitável o sistema tinha que tocar
uma sirene, bem fizemos um esquema para ler wav, mas nossa vontade era fazer com mp3!!!
Coisas de desenvolvedor, bem fizemos, mas não foi para produção, não deu tempo, não
importa, esse treco aqui funciona.

2º Criar um projeto Windows Forms Application

Agora com o DirectX SDK crie um novo projeto do tipo Windows Forms Application
com o nome que você achar melhor, bem, não mostrar com usar o OpenFileDialog, isso fica
para outro artigo.

3º Adicionar as referências

Vá ao menu “Project”, clique em “Add Reference”, na aba “.NET”, adicione as
referencias “Microsoft.DirectX” e “Microsoft.DirectX.AudioVideoPlayback”.

4º Adicionar caminho do mp3

Dê um clique duplo no formulário, agora no método Form_Load, crie uma variável do
tipo string com o nome musica e sete o valor dela como o caminho para o seu arquivo mp3
(pois é, um arquivo mp3!!!! Hehe).

5º Adicionar objeto Microsoft.DirectX.AudioVideoPlayback.Audio

Adicione um objeto do tipo Audio (Microsoft.DirectX.AudioVideoPlayback.Audio) com
o nome audio, instancie audio como um novo Audio, e passe como parâmetro o objeto musica
no construtor.

6º Executar “Play”

Agora execute o método “Play” do objeto audio.

7º Código fonte

Abaixo estão os códigos fonte em VB.NET e C#(Sharp).

VB.NET

Imports Microsoft.DirectX.AudioVideoPlayback

Public Class Form1

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load

Dim musica As String = "C:\Documents and Settings\oscar\Meus
documentos\Minhas músicas\Top Gun - Danger Zone.mp3"

Dim audio As Audio

audio = New Audio(musica)
audio.Play()

End Sub

End Class

C#(Sharp)

using System;
using System.Windows.Forms;
using Microsoft.DirectX.AudioVideoPlayback;

namespace DirectXPlayer
{

public partial class Form1 : Form
{

public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
string musica = @"C:\Documents and Settings\oscar\Meus
documentos\Minhas músicas\Top Gun - Danger Zone.mp3";
Audio music;
music = new Audio(musica);
music.Play();
}
}
}

Referencias

http://msdn.microsoft.com/en-us/directx/aa937788.aspx
http://msdn.microsoft.com/en-us/directx/default.aspx
http://msdn.microsoft.com/en-us/aa937791.aspx

Pessoal, é só isso, como vocês podem ver é super fácil, espero que tenha agregado
conhecimento. Até a próxima.

segunda-feira, 23 de novembro de 2009

Galeria de fotos com WPF

Requisitos

Windows XP com Framework .NET 3.0 ou superior para rodar a aplicação
Visual Studio 2008 ou compatível

1º Crie uma aplicação do tipo WPF Application

2º No XAML, na tag Windows, mude o atributo title para Galeria de fotos

3º Adicione as bibliotecas System.IO e System com as seguintes linhas
xmlns:s="clr-namespace:System;assembly=mscorlib"
xmlns:io="clr-namespace:System.IO;assembly=mscorlib"

4º Adicione os resources da aplicação com as seguintes linhas, é de onde as fotos serão lidas, entenda o primeiro s:String como local de suas imagens, o segundo é o filtro dos arquivos que serão lidos pela aplicação, mas já vou te explicar que ObjectType é o tipo do objeto que está sendo instanciado pelo ObjectDataProvider e o MethodName é o método desse objetos que será executado, o resto é tranqüilo.


5º Após o Windows.Resources adicione um DockPanel com o atributo LastChildFill setado como True

6º Dentro do DockPanel adicione um ListBox com os seguintes atributos x:Name="imageList", DockPanel.Dock="Top", ItemsSource="{Binding}", IsSynchronizedWithCurrentItem="True" e DataContext="{StaticResource imagens}".

7º Dentro do ListBox coloque as seguintes tag



8º Adicione o painel onde a imagem será exibida com o código abaixo.


Super tranqüilo.

Referencias.

http://windowsclient.net/wpf/
http://msdn.microsoft.com/pt-br/library/cc564903.aspx
http://msdn.microsoft.com/en-us/library/ms754130.aspx

quarta-feira, 18 de novembro de 2009

FileWatcher - Observador de arquivos

Muito simples, vamos lá.

1º Crie um projeto do tipo Windows Forms Applications.

2º Adicione uma classe com o nome FileWatcher.

3º Crie uma variável do tipo string, privada com o nome pasta.

private string pasta = @"d:\teste";


4º Crie o construtor da classe conforme abaixo.

public FileWatcher()

{

FileSystemWatcher WatchFile = new FileSystemWatcher(pasta, "*.txt");

WatchFile.Created += new FileSystemEventHandler(this.FileCreated);

WatchFile.EnableRaisingEvents = true;

}


5º Agora vamos criar o método Created, faça conforme abaixo. Esse método irá copiar o arquivo de D:\Teste para D:\Teste2 e xcluí-lo da origem

public void FileCreated(object sender, FileSystemEventArgs e)

{

Console.WriteLine(e.Name);

FileInfo fileInfo = new FileInfo(e.Name);

string pastaOrigem = @"D:\Teste";

string pastaDestino = @"D:\Teste2";

string arquivoOrigem = Path.Combine(pastaOrigem, fileInfo.Name);

string arquivoDestino = Path.Combine(pastaDestino, fileInfo.Name);

if (File.Exists(arquivoDestino))

File.Delete(arquivoDestino);

File.Copy(arquivoOrigem, arquivoDestino);

Log(arquivoOrigem, arquivoDestino);

}


6º Vamos gravar um log disso então? Basta fazer um método como esse. Ele é chamado no final do Created.

private void Log(string preCondicao, string posCondicao)

{

string arquivoLog = Path.Combine(pasta, string.Format("{0}log.txt", string.Format("{0:yyyyMMdd}", DateTime.Now)));

StreamWriter arquivoEscrita = new StreamWriter(arquivoLog, true);

arquivoEscrita.WriteLine(string.Format("{0}|{1}|{2}", preCondicao, posCondicao, DateTime.Now));

arquivoEscrita.Close();

arquivoEscrita.Dispose();

}


7º Instancie um novo FileWacther no Load do formulário.

8º Vamos testar agora, crie uma pasta chamada Teste e uma pasta Teste2, execute a aplicação e crie um arquivo texto (txt) em Teste, veja que o arquivo sumiu! E um novo arquivo chamado AAAAMMDDlog.txt foi criado, esse arquivo contém as informações do nome do arquivo de origem, nome do arquivo destino e data/hora em que ele foi movido. Se você verificar em Teste2 o arquivo estará lá.

OBS: Atenção aos caminhos das pastas, caso não tenha um diretóro D:, coloque no lugar que lhe parecer melhor.

Até a próxima.