Monday, September 3, 2012

Criando User Controls em ASP.NET


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