User Controls são componentes nos quais você inclui Tags html e um ou mais controles web, podendo tratá-los como uma unidade com suas propriedades e métodos particulares. Ou seja, pode ser visto como uma página ASP.NET que assume o comportamento de um Controle encapsulado.
Tem como grande vantagem a praticidade da utilização e reutilização de código e ganho de agilidade na manutenção.
Os User Controls são baseados na classe System.Web.UI.UserControl e difere de uma página ASP.NET nos seguintes itens:
- A extensão do arquivo de um User Control é ".ascx";
- Ao invés de usar a diretiva @page, um User Control contém uma diretiva @Control que define suas propriedades;
- Um User Control não pode ser executado diretamente, somente quando incluído em uma página ASP.NET;
- Um User Control não possui os elementos html, body ou form no seu interior.
O exemplo mais comum que temos de User Controls são páginas web que permitem a navegação do usuário não autenticado. Enquanto este usuário não estiver autenticado, um controle de Login estará disponível em todas as páginas do site e algumas ações (geralmente ações de compra e download) estão desabilitadas.
Não seria esperto neste caso escrevermos o código do controle de login em todas as páginas. Nós poderíamos usar um User Control. Cada vez que você procurar a sua Toolbox por um controle específico e ele não existir, você mesmo pode criar o seu controle e adicionar a toolbox.
Abaixo, temos um exemplo prático de como criar um User Control para input de datas no sistema. Este controle associa ao textbox aonde a data será digitada: Um controle de calendário, um controle de validação do formato de acordo com a cultura do usuário e um controle de range de datas de acordo com a base de dados com a qual estamos trabalhando.
01- Clique com o botão direito no seu projeto web e vá em Adicionar Novo item. Adicione uma nova pasta com o nome UserControls
02- Clique com o botão direito nesta pasta e vá em Adicionar novo Item. Adicione um novo User Control com o nome "DateControl" conforme mostra a figura abaixo.
03- Abra o arquivo DateControl.ascx que foi adicionado e escreva o seguinte código para adicionar os controles necessários:
04 - Agora vamos adicionar o codebehind deste controle no arquivo "DateControl.ascx.cs":
========================================================================
using System;
using AjaxControlToolkit;
namespace WebApplication1.UserControls
{
public partial class DateControl : System.Web.UI.UserControl
{
public enum DateRange
{
Aspnet,
SqlServer,
Oracle
}
private bool _isValid = false;
public bool IsValid()
{
if (_isValid)
return true;
return false;
}
private DateTime _minimumRange;
private DateTime _maximumRange;
public string Text
{
get { return tbDate.Text; }
set { tbDate.Text = value; }
}
public DateRange Range { get; set; }
protected void Page_Load(object sender, EventArgs e)
{
SetRange();
SetMask();
}
protected void Validate(object sender, EventArgs e)
{
ValidarData();
}
/// <summary>
/// Retorna o valor da data já convertido
/// </summary>
/// <returns></returns>
public DateTime? GetDate()
{
if (_isValid)
return Convert.ToDateTime(tbDate.Text);
return null;
}
/// <summary>
/// Tenta converter a data e compara com o range. Em caso de falha limpa o texto.
/// </summary>
private void ValidarData()
{
try
{
var date = Convert.ToDateTime(tbDate.Text);
//Check range
if (date < _minimumRange)
{
Clear();
}
else if (date > _maximumRange)
{
Clear();
}
_isValid = true;
}
catch
{
Clear();
}
}
/// <summary>
/// Determina o mínimo e máximo suportado pela estrutura de dados
/// </summary>
private void SetRange()
{
switch (Range)
{
default:
_minimumRange = System.DateTime.MinValue;
_maximumRange = System.DateTime.MaxValue;
break;
case DateRange.Aspnet:
_minimumRange = System.DateTime.MinValue;
_maximumRange = System.DateTime.MaxValue;
break;
case DateRange.Oracle:
//4712 antes de cristo não é suportado pelo .Net?
_minimumRange = System.DateTime.MinValue;
_maximumRange = new DateTime(9999, 12, 31, 23, 59, 59);
break;
case DateRange.SqlServer:
_minimumRange = new DateTime(1753, 01, 01);
_maximumRange = new DateTime(9999, 12, 31, 23, 59, 59);
break;
}
}
private void SetMask()
{
var mke = new CalendarExtender();
mke.TargetControlID = tbDate.UniqueID;
mke.Format = System.Threading.Thread.CurrentThread.CurrentUICulture.DateTimeFormat.ShortDatePattern;
upDateControl.ContentTemplateContainer.Controls.Add(mke);
}
/// <summary>
/// Limpa o conteúdo da caixa e marca o estado como inváido
/// </summary>
private void Clear()
{
tbDate.Text = "";
_isValid = false;
}
}
}
========================================================================
05 - Para usar o controle, crie uma nova página Default.aspx e adicione o seguinte código:
Vamos agora fazer um outro controle que desta vez valide uma data de início e uma data de fim de um determinado período. Este controle aplica todas as regras do DateUsercontrol porém valida se a data de fim é maior que a data de início.
01 - Clique com o botão direito na pasta UserControls e vá em Adicionar novo Item. Adicione um novo User Control com o nome "DateFromToControl" e adicione o código ao arquivo .ascx, conforme mostra a figura abaixo.
02 - Adicione o CodeBehind:
using System;
using System.Web.UI.WebControls;
using AjaxControlToolkit;
namespace WebApplication1.UserControls
{
public partial class DateFromToControl : System.Web.UI.UserControl
{
public enum DateRange
{
Aspnet,
SqlServer,
Oracle
}
private bool _isValidTo = false;
private bool _isValidFrom = false;
private bool _isValid = false;
private DateTime _minimumRange;
private DateTime _maximumRange;
public DateRange Range { get; set; }
public string FromText{ get; set; }
public string ToText { get; set; }
protected void Page_Load(object sender, EventArgs e)
{
lblFrom.Text = FromText;
lblTo.Text = ToText;
SetRange();
SetMask();
}
protected void Validate(object sender, EventArgs e)
{
_isValid = false;
ValidarTo();
ValidarFrom();
if (_isValidTo & _isValidFrom)
{
if (Convert.ToDateTime(tbDate.Text) > Convert.ToDateTime(tbDate2.Text))
{
var tb = (TextBox)sender;
if(tb.UniqueID == tbDate.UniqueID)
ClearTo();
else
{
ClearFrom();
}
}
else
_isValid = true;
}
}
public DateTime? GetToDate()
{
if (_isValidTo)
return Convert.ToDateTime(tbDate.Text);
return null;
}
public DateTime? GetFromDate()
{
if (_isValidFrom)
return Convert.ToDateTime(tbDate.Text);
return null;
}
private void ValidarTo()
{
try
{
var date = Convert.ToDateTime(tbDate.Text);
//Check range
if ((date < _minimumRange) || (date > _maximumRange))
{
ClearTo();
}
else
_isValidTo = true;
}
catch
{
ClearTo();
}
}
private void ValidarFrom()
{
try
{
var date = Convert.ToDateTime(tbDate2.Text);
//Check range
if ((date < _minimumRange) || (date > _maximumRange))
{
ClearFrom();
}
else
_isValidFrom = true;
}
catch
{
ClearFrom();
}
}
private void SetRange()
{
switch (Range)
{
default:
_minimumRange = System.DateTime.MinValue;
_maximumRange = System.DateTime.MaxValue;
break;
case DateRange.Aspnet:
_minimumRange = System.DateTime.MinValue;
_maximumRange = System.DateTime.MaxValue;
break;
case DateRange.Oracle:
//4712 antes de cristo não é suportado pelo .Net?
_minimumRange = System.DateTime.MinValue;
_maximumRange = new DateTime(9999, 12, 31, 23, 59, 59);
break;
case DateRange.SqlServer:
_minimumRange = new DateTime(1753, 01, 01);
_maximumRange = new DateTime(9999, 12, 31, 23, 59, 59);
break;
}
}
private void SetMask()
{
var mke = new CalendarExtender
{
TargetControlID = tbDate.UniqueID,
Format = System.Threading.Thread.CurrentThread.CurrentUICulture.DateTimeFormat.ShortDatePattern
};
var mke2 = new CalendarExtender
{
TargetControlID = tbDate2.UniqueID,
Format = System.Threading.Thread.CurrentThread.CurrentUICulture.DateTimeFormat.ShortDatePattern
};
upDateControl.ContentTemplateContainer.Controls.Add(mke);
upDateControl.ContentTemplateContainer.Controls.Add(mke2);
}
private void ClearTo()
{
tbDate.Text = "";
_isValidTo = false;
_isValid = false;
}
private void ClearFrom()
{
tbDate2.Text = "";
_isValidFrom = false;
_isValid = false;
}
}
}
03 - Para finalizar, abra a página Default.aspx e adicione o seguinte código:





No comments:
Post a Comment