sexta-feira, 13 de fevereiro de 2009

Artigo: Editando Templates, DataList

Quando utilizamos o DataList temos a possibilidade de personalizarmos ele, para isso basta dar um clique em cima dele e selecionar Edit Template.
Esse exemplo se baseará no resultado que você ve quando pesquisa um livro em uma livraria, onde a livraria te mostra o preço, a imagem, a editora e outras informações.
Não acessarei os dados de um banco, eu os iniciarei em uma parte do programa, para que assim você apenas copie o código e o compile em seu micro e veja o mesmo resultado, você necessitará apenas mudar o caminho da figura.
Porém com algumas mudanças você poderá utilizar dados retornados do banco.

Primeiramente estas são as figuras que utilizarei:




1 - Inicie um novo programa Asp.NET Web Application e renomeie para ExemploDataGrid.


2 - Arraste um DataList para a página e escolha Edit Templates.


Agora você poderá arrastar componentes ou configurar o layout como se fosse uma página normal. Aliás se você ir em Source você poderá ver o HTML gerado para a edição de template.

3 - Insira uma tabela 2 x 2, para isso vá no menu do Visual Studio e clique em
Table->Insert Table.




Agora é só clicar em OK.

4 - Arraste três Labels e um Image, de forma que seu DataList fique igual ao da figura abaixo.


5 - Antes de continuarmos com a edição do DataList vamos criar uma classe chamada Livros, para isso clique em seu projeto com o botão direito do mouse e escolha
Add > New Item -> Class


Insira esse código em sua classe, que possui quatro propriedades e um construtor de quatro argumentos.

public class Livros {
public string Nome { get; set; }
public string Autor { get; set; }
public string Descricao { get; set; }
public string Imagem { get; set; }

public Livros( string nome, string autor, string descricao, string imagem ) {
this.Nome = nome;
this.Autor = autor;
this.Descricao = descricao;
this.Imagem = imagem;
}
}

6 - Agora voltamos para editar nosso DataList, de um clique em cima do primeiro Label e escolha Edit DataBindings...


7 - Para os Labels selecione Text e coloque Eval("propriedade"), o exemplo abaixo se refere ao nome:


Faça o mesmo com o segundo e o terceiro Label colocando respectivamente
Eval("Autor") e Eval("Descricao"), no Image selecione ImageURL e coloque Eval("Imagem"), repare que você usa suas propriedades da classe, o nome deve ser idêntico. Isso não funcionará com variável, apenas com propriedade.

8 - Agora nossa última parte, adicione esse código no Page_Load da página.

public partial class _Default : System.Web.UI.Page {
protected void Page_Load( object sender, EventArgs e ) {
List <Livros> livros = new List <Livros>( );

livros.Add(new Livros("C# - Como Programar",
"Deitel",
"Livro de C#",
@"seucaminho"));


livros.Add(new Livros("Microsoft Visual C# 2005",
"John Sharp",
"Livro de C#",
@"seucaminho"));

this.DataList1.DataSource = livros;
this.DataList1.DataBind( );

}
}

9 - Resultado:



Pronto está feito, mas não está nada bonito não é mesmo? Agora é com você vá em propriedades e veja o que você tem disponível para mudar ou então edite o HTML.

Até a próxima.

terça-feira, 10 de fevereiro de 2009

Artigo: Entendendo e Utilizando a Classe List

Vamos lá, neste artigo iremos falar da classe List presente no Generics apartir do .Net 3.5. Mas antes vamos dar uma passada rapida em estrutura de dados para termos noção de como a classe List é útil.

Qual a primeira forma que nos vem cabeça quando se fala em armazenar dados na memória?
Um vetor "arrays" seria a primeira resposta. Legal, mas se pararmos para pensar que um vetor é uma estrutura de dados estática. Isso nos deixa muito limitados, por exemplo.

Queremos armazenar um vetor com nomes de determinados alunos de uma sala de aula. Suponhamos que a sala tenha 20 alunos então teremos:

String [ ] nomeAlunos = new String [ 20 ];

No código acima nós criamos um array nomeAlunos do tipo que armazena variáveis do tipo string com 20 posições.

Mas, e se pararmos para pensar;
- Será que a sala de aula vai ter sempre 20 alunos?
- E se eu quiser remover um aluno?
- E se eu quiser adicionar um aluno?

Ai logo de cara você responde, tem sim como aumentar o tamanho do meu array e também tem como remover e adicionar um novo aluno!

Concordo com você, mais até o fim deste artigo você irá concordar comigo que usar a List é muito mais fácil e sem falar divertido.

Vamos lá, outro exemplo. suponhamos que o array nomeAlunos esteja assim.

nomeAlunos [ 0 ] = "Jose";
nomeAlunos [ 1 ] = "Joao";
nomeAlunos [ 2 ] = "Pedro";
nomeAlunos [ 3 ] = "Maria";
nomeAlunos [ 4 ] = "Helena";

Primeiro Problema: A Memória!
Nós temos um vetor de 20 posições e estamos utilizando somente 5 posições ou seja, temos 15 espaços alocados na memória atoa.

Segundo Problema: Deletar Aluno!
O João mudou de cidade, então tempos que deletar ele do nosso array. Deletando o João nosso array fica da seguinte forma:

nomeAlunos [ 0 ] = "José";
nomeAlunos [ 1 ] = ""; // espaço alocado atoa na memória
nomeAlunos [ 2 ] = "Pedro";
nomeAlunos [ 3 ] = "Maria";
nomeAlunos [ 4 ] = "Helena";

Caímos no Primeiro Problema, agora nos tempos 16 posições sendo alocadas na memória atoa.

Terceiro Problema: Adicionar novos alunos!
Logo de cara parece uma tarefa fácil, agora eu te pergunto: Em qual posição do array você vai adicionar o novo aluno?
Você logo me responde, adiciona na posição 1 para aproveitar o espaço alocado na memoria.
Correto, mas já imaginou o trabalho que você vai ter toda vez que precisar adicionar um novo elemento em um array, você vai ter que varrer todo o array em busca de um espaço livre.
Mas, e se eu adicionar em uma posição do array que já existe um aluno cadastrado?
O aluno cadastrado será sobreposto pelo novo aluno, você irá perder dados, e você não quer isso!

Quarto Problema: E se o array estiver lotado?
Você não pode simplesmente ir lá no array e mudar o tamanho do array para 22 posições. Pois ao fazer isso você estará criando um novo array de 22 posições e apagando todos os dados do array de 20.

Tem solução? Claro que tem, usando array:
Você copia os dados desse array de 20 para seu novo array de 22 posições. Concorda comigo que isso é um baita de um trabalho?

Você deve estar pensando, tudo tem solução usando no máximo uma estrutura de repetição, e pra que se preocupar com espaço vazio alocado na memoria já que hoje temos computadores com 4Gb de memoria.

É ai que está o X da questão, imagina se você precisar trazer centenas de dados de um Banco de Dados para trabalhar com eles durante o programar e depois ter que gravar esses dados novamente no Banco de Dados. Olha o trabalho que não vai ser gerenciar esse array. É ai que entra a classe List!


Agora vem a parte boa...

A classe List nada mais é que um vetor dinâmico. Vamos usar a classe List para o mesmo exemplo, olha que legal.

Vamos criar a List:

List<String>nomeAlunos = new List<String>();

No código assina nós criamos uma List nomeAlunos do tipo que armazena variáveis do tipo String. Notou alguma diferença? Eu não especifiquei o tamanho, pois como eu disse ela é dinâmica, aumenta ou diminui sua capacidade conforme a necessidade do programador.

Utilizando a Classe List você pode adicionar ou apagar um aluno em qualquer lugar da List sem perder dados. Legal né? Vamos a pratica!

Vamos adicionar os alunos na List: Isso é feito através do método Add como pode ser observado.

nomeAlunos.Add ( "Jose");
nomeAlunos.Add ( "Joao");
nomeAlunos.Add ( "Pedro");
nomeAlunos.Add ( "Maria");
nomeAlunos.Add ( "Helena");

Reparou algo de novo, nós não temos mais o indexador quando adicionamos um novo elemento na lista.

Por padrão a List vai adicionando novos elementos sempre no final. Portando o funcionamento é igual ao de um array sem a necessidade de informar o indexador.

O indexador só vai aparacer em casos específicos como quando você quiser buscar, adicionar ou imprimir algum elemento da List.

Olha só com a List fica indexada:

nomeAlunos[ 0 ] armazena "Jose"
nomeAlunos[ 1 ] armazena "Joao"
nomeAlunos[ 2 ] armazena "Pedro"
nomeAlunos[ 3 ] armazena "Maria"
nomeAlunos[ 4 ] armazena "Helena"

Pratica: Vamos aos mesmos problemas do Array?

Primeiro Problema: A Memória!
Não temos mais espaços alocados sem necessidades na memória. Então, não temos mais o problema da memória.

Segundo Problema: Deletar Aluno!
O Joao mudou de cidade, então tempos que deletar ele do nossa List. Facil, deletamos o João e a List anda com os outros dados para o lado do menor indexador. Assim ela nao deixa espaço alocado sem uso na memória.

Na pratica para deletar somento o Joao utilizamos o metodo RemoveAt e passamos como parâmetro o indexador 1 que é onde o Joao está armazenado.

nomeAlunos.RemoveAt ( 1 );

Depois de deletar Joao nossa List fica assim:

nomeAlunos[ 0 ] armazena "Jose"
nomeAlunos[ 1 ] armazena "Pedro"
nomeAlunos[ 2 ] armazena "Maria"
nomeAlunos[ 3 ] armazena "Helena"

Reparou o que aconteceu? Não tivemos espaços alocados sem necessidade na memória.


Terceiro Problema: Adicionar novos alunos!
Tarefa super fácil usando List:

Se você quiser apenas adicionar um novo aluno não é necessário especificar indexador, basta fazer o seguinte.

nomeAlunos.Add("Juca");

Facil né? Nossa List fica assim:

nomeAlunos[ 0 ] armazena "Jose"
nomeAlunos[ 1 ] armazena "Pedro"
nomeAlunos[ 2 ] armazena "Maria"
nomeAlunos[ 3 ] armazena "Helena"
nomeAlunos[ 4 ] armazena "Juca"


Tá bom, agora eu quero ver! Entrou um novo aluno, o Francisco. Mas eu quero adicionar na posição 3. Tem como?
Simples, fácil e rápido, quer ver?

nomeAlunos.Insert ( 3 , "Francisco" );

Utilizamos o método Insert, e nele passamos o indexador e o nome do Francisco. Não falei que era simples, facil e rapido?

E nossa lista fica assim:

nomeAlunos[ 0 ] armazena "Jose"
nomeAlunos[ 1 ] armazena "Pedro"
nomeAlunos[ 2 ] armazena "Maria"
nomeAlunos[ 3 ] armazena "Francisco"
nomeAlunos[ 4 ] armazena "Helena"
nomeAlunos[ 5 ] armazena "Juca"

Percebeu o que a List fez? Ela realocou os elementos acima e o 3 inclusive para uma posição posterior e adicionou Francisco na posição 3.

Quarto Problema: E se o List estiver lotado?
A List nunca vai estar lotado, e nunca vai alocar espaço na memoria atoa.


A grande jogada da List...

Até agora você sabe que a List é dinâmica. Mas essa não é a grande jogada da List já que essa é a função dela "ser dinâmica". A grande jogada está no conceito de Generics presente no .Net 3.5 como eu mencionei no inicio deste artigo.

O que vem a ser esse tal Generics?
O Generics permite que Classes, Métodos, Propriedades entre outras funcionalidades usem o tipo que você criou, ou seja, você não fica preso a tipos já programados como Int, String e Double.

E o que isso quer dizer?
Ficamos livres de boxing e unboxing, tá bom nem tando né, mais vai reduzir e muito as conversões.

Vamos a um exemplo prático!

Continuando com o mesmo exemplo da sala de aula. Só que agora nao queremos gravar somente o nome. Queremos gravar um tipo Aluno na List. Teremos:

public class Aluno {
                     public string Nome;
                public int Idade;
}                                

Criamos uma Classe Aluno com Métodos definindo as características dos alunos, viu como até agora não tem segredo nenhum!
Agora a única coisa que temos que fazer é criar um objeto da classe aluno, o resto é igual ao que foi explicado até aqui usando os Métodos da Classe List o Add, Insert e outros.

Vamos para pratica: Primeiro vamos criar nossa nova List

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

Percebeu diferença? Agora a List tem o tipo que você criou, ou seja ela é do tipo Aluno e vai armazena todas as características que você der para o Aluno.

E só para finalizar com a ultima pratica:

Aluno cadastraAluno = new Aluno ( );

Aqui nos criamos um Objeto que tem todas as características da Classe Aluno. Algum segredo em criar esse Objeto? Nada né, eu falei que ia ser divertido usar List.

cadastraAluno.Nome = "Luiz";

cadastraAluno.Idade = 8;

E novamente sem uso de Mágica ou algo do tipo atribuímos valores nas características do aluno. E por fim adicionamos o Objeto na List da mesmo jeito que você aprendeu.

listaAlunos.Add ( cadastraAluno );

Facil assim? Eu falei que era facil, rapido simples e divertido!

Bom, por hoje é só... Se tiverem alguma duvida deixe-as nos comentários.



Ah, já estava esquecendo... Apartir de hoje você ainda vai usar array?


Artigo: Utilizando o GridView.

Este artigo falará como preencher uma GridView a partir de uma classe, ou então selecionando apenas alguns dados específicos dos dados retornados. Isso também poderá ser feito com dados sendo retornados do banco e preenchendo uma List de determinada classe.
Sei que o Visual Studio possui um assistente, que facilita e muito as coisas, porém há casos que não há maneira de fazer pelo assitente, ou então o seu chefe não quer utilizá-lo, para que assim o seu código fique mais independente, nesse caso é que esta postagem terá efeito.

Pra começar inicie um novo Asp.Net Web Application.

Feito isso arraste um GridView para seu WebForm.

Abaixo o código da classe que preencherá o GridView:

public class DataAccess {

public string Nome { get; set; }

public string Sobrenome { get; set; }

public int Idade { get; set; }

public DataAccess( string n, string s, int i) {

this.Nome = n;

this.Sobrenome = s;

this.Idade = i;

}

}

Agora no codebehind do WebForm adicionarei o código para preencher um List, para ver mais sobre List<> leia a postagem de Mateus Melo.

public partial class _Default : System.Web.UI.Page {

protected void Page_Load( object sender, EventArgs e ) {

List<DataAccess> lista = new List<DataAccess>( );

lista.Add( new DataAccess( "Zé", "Do Pulo", 40 ) );

lista.Add( new DataAccess( "João", "Sem Braço", 15 ) );

lista.Add( new DataAccess( "Maria", "Aparecida", 25 ) );

this.GridView1.DataSource = lista;

this.GridView1.DataBind( );

}

}

Feito isso o resultado será esse:

Agora suponhamos que você queira apenas mostrar o nome:

De um clique no seu GridView e escolhe Add New Column:

Na janela que abre, escolha BoundField para field type, coloque o nome que quiser para Header Text, porém o nome de Data Field terá que ser o mesmo da propriedade de sua classe, isso só funcionará com propriedade:

Para que o GridView não gere colunas automáticas de um clique no GridView, vá em propriedades e em AutoGenerateColumns coloque falso:

Pronto, agora seu resultado será esse:

Espero ter ajudado, até a próxima.

Microsoft disponibiliza download gratuito.

A Microsoft disponibiliza downloads gratuitos no site https://www.dreamspark.com/default.aspx, entre eles Visual Studio 2005 e 2008 Professional, SQL Server Developer e Windows Server 2008 Standard.
Para conseguir baixar basta ter um contrato do CIEE ativo. Esta é mais uma parceria entre a Microsoft e estudantes.

Deixe suas dúvidas.

Pessoal é só vocês postarem suas dúvidas que responderemos. Este blog será destinado a C# e as ferrmentas do Visual Studio. Temos também o os blogs destinados a Java http://javaprogramando.blogspot.com/ e a C e C++ http://cprogramando.blogspot.com/.
Bom pra começar é isso, colocaremos artigos também, e caso tenha curiosidade nós atualizaremos o blog todos os dias, respondendo as dúvidas sequencialmente.