Categorias

Criando Controles personalizados no Asp.Net

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

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

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

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

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

TemplateContainer
https://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;
Usaremos também o [TemplateContainer(typeof(ClsTempleteItem))]
Note que o typeof é ClsTempleteItem
Este atributo é utilizado para fornecer o tipo de conteúdo do modelo.
[TemplateContainer(typeof(ClsTempleteItem))]
public ITemplate Cabecalho {
get { return _Cabecalho; }
set { _Cabecalho = value; }
} //o resto da implementação está no exemplo para download.
/* Nós poderíamos ter usado o RepeaterItem ao invés da classe ClsTempleteItem */
Depois de construir nosso conteúdo vamos implementar nosso próprio DataBind.
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 páginação,ordenação e etc..

/*
Uma versão em formato word com imagens está disponivel junto com o fonte para testes.
*/