Desenvolvimento - ASP. NET

Criando Controles personalizados no Asp.Net

Este artigo tem como objetivo a criação de controles personalizados sem dor de cabeça e complicações.

por Francke Peixoto



Neste artigo iremos mostrar como é fácil criar um controle e para facilitar o nosso entendimento, vamos criar o nosso próprio Repeater, depois desse artigo você terá uma visão mais clara de como são criados alguns dos controles mais usados por nós [Repeater,GridView,DataList entre outros].

Em nossa construção iremos usar os tipos de dados:
IEnumerable
http://msdn2.microsoft.com/en-us/library/system.collections.ienumerable.aspx

ITemplate
http://msdn2.microsoft.com/en-us/library/system.web.ui.itemplate(VS.71).aspx

INamingContainer
http://msdn2.microsoft.com/en-us/library/system.web.ui.inamingcontainer.aspx

Control
http://msdn2.microsoft.com/en-us/library/aa752040.aspx

IDataItemContainer
http://msdn2.microsoft.com/en-us/library/system.web.ui.idataitemcontainer.aspx

TemplateContainer
http://msdn2.microsoft.com/em-us/library/system.web.ui.templatecontainerattribute.aspx

Para ter uma descrição mais solida sobre esses dados consulte o MSDN.


A partir de agora iniciaremos a contrução de nosso controle.
Vamos criar uma classe chamada
ClsTempleteItem
que herda de um Control, System.Web.UI.INamingContainer, IDataItemContainer

public class ClsTempleteItem : Control, System.Web.UI.INamingContainer, IDataItemContainer

{

private object dataitem;

public ClsTempleteItem(object dataitem)

{ this.dataitem = dataitem; }

}


Nosso controle -> MeuControle.ascx. [WebControl]

[MeuCotrole.ascx.cs] No .cs do WebControl adicionaremos nossos templates.


private ITemplate _Item;
private
ITemplate _ItemAlternado;
private ITemplate _Cabecalho;
private ITemplate _Rodape;
private IEnumerable _MeuDataSource;
Este atributo é utilizado para fornecer o tipo de conteúdo do modelo.
//o resto da implementação está no exemplo para download.

/* Nós poderíamos ter usado o RepeaterItem ao invés da classe ClsTempleteItem */

public override void DataBind(){

AddTemplateAsControl(Cabecalho, null);

IEnumerator IEdados = DataSource.GetEnumerator();

bool blnAlternar = false;

while (IEdados.MoveNext()){

if (blnAlternar && ItemAlternado != null)

AddTemplateAsControl(Item, IEdados.Current);

else if (ItemAlternado != null)

AddTemplateAsControl(ItemAlternado, IEdados.Current);

blnAlternar = !blnAlternar;

}

AddTemplateAsControl(Rodape, null);

base.DataBind();
}

private void AddTemplateAsControl(ITemplate template, object p){

ClsTempleteItem conteudo= new ClsTempleteItem(p);
/* A interface ITemplate possui um método chamado InstantiateIn,

* que é usado para tornar o modelo em
* conteúdo para um controle especifico.

*/

template.InstantiateIn(conteudo);

this.Controls.Add(conteudo);

}

Com nosso controle criado, vamos ao nosso aspx.

Em nosso aspx.cs iremos criar uma listagem com notas de Alunos para abastecer nosso controle.

public class Notas {

private string nome;

private float nota;

public string Nome {

get { return nome; }

set { nome = value; }

}

public float Nota{

get { return nota; }

set { Nota = value; }

}

public Notas(string nome, float nota){

this.nome = nome;

this.nota = nota;

}

}

Page_Load do aspx.cs
List<Notas> ls = new List<Notas>();
ls.Add(new Notas("Ana Maria", float.Parse("10,0")));

ls.Add(new Notas("Claudo Ralha", float.Parse("7,8")));

ls.Add(new Notas("Marcio Elias", float.Parse("9,8")));

ls.Add(new Notas("Francke Peixoto", float.Parse("3,9")));
Ao arrastar o controle para a página aspx. Teremos essa visão.

No source do controle poderemos usar a seguinte estrutura:

(parecido com o Repeater? ;-)
Agora é só fazer como sempre fazemos no Repeater.

No Page_Load :
MeuControle1.DataSource = ls;

MeuControle1.DataBind();
Ao gerar nossa página o resultado ficará parecido com o print abaixo:

Bom, agora já sabemos como criar nosso próprio controle, caso queira, você poderá implementar funcionalidades que o repeater ainda não tem como paginação, ordenação e etc.

Baixe o exemplo.

Francke Peixoto

Francke Peixoto