Pessoal,

outro dia, precisei fazer uma edição de um conteúdo de apenas uma linha (um campo) de uma forma direta, no estilo “Web 2“, para um novo portal que estamos criando no #CFOAB. Para não duplicar código e provavelmente isso iria acontecer, acabei decidindo fazer meu primeiro plugin para o jQuery. Até então, eu vinha mexendo muito com o ExtJS e ficava só na vontade de mexer com o jQuery desde que se tornou padrão no ASP.NET.

A idéia do plugin é simples e deve ser utilizado por um único objeto DOM, utilizando os seletores do jQuery, passando pelo menos dois parâmetros obrigatórios (urlRequest e nomeParam).

Infelizmente, meu host (arght!), não deixou configurado o ASP.NET MVC, nem 1, nem 2, e então eu acabei usando o WebForms para a demonstração, mas vou postar o código utilizando o ASP.NET MVC 1 (RTM) e 2 (RC).

Antes de partir para o código, aqui vai uma DEMO do resultado aplicado em uma div e uma table.

Então vamos aos códigos CSS, Javascript, jQuery e HTML.

Código HTML

<%@ Page Language=”C#” AutoEventWireup=”true”  CodeFile=”Default.aspx.cs” Inherits=”_Default” %>

<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>

<html xmlns=”http://www.w3.org/1999/xhtml”>
<head runat=”server”>
    <title>JQuery Plugin - Change In Line : Demo - Bruno Kenj</title>
    <link href=”Content/Site.css” rel=”stylesheet” type=”text/css” />
    <script src=”http://ajax.googleapis.com/ajax/libs/jquery/1.4.0/jquery.min.js” type=”text/javascript”></script>
    <!– Microsoft AJAX CDN: http://ajax.microsoft.com/ajax/jquery/jquery-1.4.0.min.js –>
    <script src=“Scripts/ChangeInLine.js” type=“text/javascript”></script>
    <!– Cada aplicação deve ter sua própria configuração de input, etc –>
    <style type=“text/css”>
            input { border:1px solid #e3e3e3; }
            .clEdit { padding: 5px; width:300px; }
            table { border:0px; width:310px; }
            table tr td.texto { width:100px; }
    </style>
</head>

<body>

    <div id=“txtEmail” class=“clEdit”>contato@brunokenj.net</div>

    <table>
        <tr>
            <td class=“texto”>E-mail:</td>
            <td id=“txtEmailTable” class=“clEdit”>contato@brunokenj.net</td>
        </tr>
    </table>

    <script type=“text/javascript”>

        $(document).ready(function() {

            function ChangeEmail(args) {
                alert(‘O email ‘ + args.email + ‘ foi alterado? ‘ + args.sucesso);
            }

            var options = {
                urlRequest: ‘Servicos/AlterarEmail.ashx’,
                nomeParam: ‘email’,
                savedChanges: ChangeEmail
            };

            $(‘#txtEmail’).ChangeInLine(options);

            $(‘#txtEmailTable’).ChangeInLine(options);

        });

    </script>

</body>
</html>

Para fazer a chamada no javascript para o Change In Line, basta recuperarmos o objeto DOM com o jQUery e chamar a função ChangeInLine(opts) informando os parâmetros necessários.

$('#txtEmail').ChangeInLine({ urlRequest: 'Servicos/AlterarEmail.ashx', nomeParam: 'email', savedChanges: ChangeEmail });

Dois parâmetros são obrigatórios:

1. urlRequest: URL que recebe o POST com o conteúdo na variável nomeParam.
2. nomeParam: Nome da variável que vai receber o valor do campo a ser alterado.

Não obrigatórios:

1. savedChanges: function(args). Função para ação pós requisição.
2. urlImageSave: URL da imagem de Salvar.
3. urlImageCancel: URL da imagem de Cancelar.
4. urlImageLoading: URL da imagem de Loading.

Vamos ao restante agora CSS e jQuery.

CSS

/* Componente Change in Line */
.clEdit { background:#fff url(Imagens/12-em-pencil.png) no-repeat 99% 50%; cursor:pointer; padding-right:15px; }
.clEditHover { background-color:#ffffd3; }
.clActive { background-color:#ffffd3; background-image:none; }

Bem simples, apenas três classes. Fique atento ao caminho da imagem na classe clEdit.

E para finalizar, o plugin do jQuery:

Change In Line

/* Criado por Bruno Kenj (http://www.brunokenj.net) */
(function($) {

    $.fn.ChangeInLine = function(options) {

        var defaults = {
            urlRequest: ,
            nomeParam: ,
            urlImageSave: ‘Content/Imagens/16-circle-green-check.png’,
            urlImageCancel: ‘Content/Imagens/16-circle-red-delete.png’,
            urlImageLoading: ‘Content/Imagens/loading.gif’,
            savedChanges: function(args) { }
        };

        var options = $.extend(defaults, options);

        var root, valorTexto, html, loading;

        function setActive(obj) {
            obj.data(‘inEdit’, true);
            obj.unbind(‘click’);
        }

        function setInative(obj) {
            obj.data(‘inEdit’, false);
            obj.bind(‘click’, onChangeInLine);
        }

        function setFocus(obj) {
            obj.find(‘input’).select();
        }

        function onFocus() {
            this.select();
        }

        function save() {
            saveChanges(root, false);
        }

        function cancel() {
            saveChanges(root, true);
        }

        function setEventInButtons(obj) {
            obj.find(‘.clSavar’).click(save);
            obj.find(‘.clCancelar’).click(cancel);
        }

        function setHTML(obj, valor) {
            obj.html(valor);
        }

        function toogleActive(obj) {
            obj.toggleClass(“clActive”);
        }

        function isLoading() {
            return loading;
        }

        function setLoading(isLoading) {
            loading = isLoading;

            if (isLoading) {
                var space = ‘&nbsp;’;
                var inputText = ‘<input type=”text” value=”‘ + root.find(‘input’).val() + ‘” disabled=”disabled” />’;
                var imageLoading = ‘<img src=”‘ + options.urlImageLoading + ‘” class=”clLoading” width=”16″ height=”16″ />’;
                setHTML(root, inputText + space + space + imageLoading);
            }
        }

        function onChangeInLine() {
            if (root.data(‘inEdit’) == false || root.data(‘inEdit’) == null) {
                valorTexto = root.html();

                var space = ‘&nbsp;’;
                var inputText = ‘<input type=”text” value=”‘ + valorTexto + ‘”/>’;
                var buttonOK = ‘<img src=”‘ + options.urlImageSave + ‘” class=”clSavar” width=”16″ height=”16″ />’;
                var buttonNO = ‘<img src=”‘ + options.urlImageCancel + ‘” class=”clCancelar” width=”16″ height=”16″ />’;

                html = inputText + space + space + buttonOK + space + buttonNO;

                setActive(root);
                setHTML(root, html);
                setEventInButtons(root);
                setFocus(root);
            }
            else {
                setInative(root);
                setHTML(root, valorTexto);
            }

            toogleActive(root);
        }

        var savedChangesCallBack = function(args) {
            onChangeInLine();
            setLoading(false);
            root.removeClass(‘clEditHover’);
            root.html(eval(‘args.’ + options.nomeParam));
            options.savedChanges(args);
        }

        function saveChanges(obj, cancel) {
            if (cancel) {
                obj.click(onChangeInLine);
            } else {
                var objJson = eval(‘({ “‘ + options.nomeParam + ‘”: “‘ + obj.find(‘input’).val() + ‘” })’);
                setLoading(true);
                jQuery.post(options.urlRequest, objJson, savedChangesCallBack, “json”);
            }
        }

        function mouseOver() {
            $(this).addClass(‘clEditHover’);
        }

        function mouseOut() {
            $(this).removeClass(‘clEditHover’);
        }

        return this.each(function() {
            root = $(this);
            root.click(onChangeInLine)
                .mouseover(mouseOver)
                .mouseout(mouseOut);
        });
    };
})(jQuery);

Dica: para evitar problemas com outras bibliotecas, o mínimo para fazermos o plugin deve ser:

(function($){
 $.fn.ChangeInLine = function() {  

    return this.each(function() {  

    });
 };
})(jQuery);

OK. Mas, ainda falta receber o valor no servidor para realizar a persistência do dado. Vou colocar o exemplo utilizando WebForms, MVC 1 e MVC 2 RC.

Obs: Nestes exemplos, eu adicionei o Thread.Sleep(600) para podermos ver melhor o efeito de loading.

WebForms (AlterarEmail.ashx - Handle HTTP)

<%@ WebHandler Language=“C#” Class=“AlterarEmail” %>

using System;
using System.Web;

public class AlterarEmail : IHttpHandler {

    public void ProcessRequest (HttpContext context) {
        System.Threading.Thread.Sleep(600);
        string email = context.Request.Form[“email”];
        context.Response.ContentType = “text/json”;
        string retorno = string.Format(“”sucesso”: true, ”email”: ”{0}”", email);
        context.Response.Write(“{” + retorno + “}”);
    }

    public bool IsReusable { get { return false; } }
}

Bem simples. Reparem que a variável que vem no Request do Form é o nome (email) informado na configuração do plugin. Aqui, eu poderia ter usado alguma biblioteca para serializar o JSON mas fiz direto com string mesmo.

ASP.NET MVC 1 (ServicosController)

[AcceptVerbs(HttpVerbs.Post)]
public JsonResult AlterarEmail(string email)
{
    System.Threading.Thread.Sleep(600);
    var retorno = new { sucesso = true, email };
    return Json(retorno);
}

ASP.NET MVC 2 (ServicosController)

public JsonResult AlterarEmail(string email)
{
    System.Threading.Thread.Sleep(600);
    var retorno = new { sucesso = true, email };
    return Json(retorno, JsonRequestBehavior.AllowGet);
}

Recursos utilizados e Download:

Download das Imagens
Download da Solução (WebForms)

DEMONSTRAÇÃO

Espero que tenham gostado do plugin. Como eu fiz ele em uma tarde, é possível que exista algum erro. Se alguém encontrar antes de mim, por favor, me informe que eu atualizo o post. Se alguém tiver alguma dúvida, pode me procurar no Twitter: @brunokenj.

Já tenho em mente uma próxima melhoria: permitir o uso de TextArea para campos de textos grandes e outros controles HTML.

abraços,

Pessoal,

Vamos realizar o 2º Happy Hour do BRASILDOTNET no dia 30/01 (Sábado), a partir das 19:00 no FRIDAY’S (Pier 21).

Quem foi no primeiro HH, se divertiu um bocado. Aguardo vocês lá para confratenizarmos e conversamos um pouco sobre o que está por vir em 2010.

Qualquer dúvida, podem me ligar: 9258.1277 (Bruno).

Link da publicação no BRASILDOTNET

abraços,
abraços,

Pessoal,

algumas pessoas estão usando o Chrome e ao colocar o foco dentro de um campo html, uma borda é adicionada automaticamente neste campo. Como desenvolvedores Web, devemos ficar atentos pois isso pode ocasionar algum problema no layout.

A borda adicionada pelo Chrome é mais ou menos isso daqui, somado com o efeito de anti-aliasing.

input:focus { border:1px solid #e3be75; outline:1px solid #f1ca80; }

Para sobrescrevermos este comportamento, basta alterarmos o atributo outline, durante o foco (:focus).

Para substituir em todos os elementos, podemos um dos dois códigos abaixo:

*:focus { outline:0 none; }

input:focus { outline:0 none; }

Para personalizar a borda, podemos usar o seguinte exemplo:

CSS:

*:focus { outline:0 none; }
input { border:1px solid #e3e3e3; }
input.minhaBorda:focus { border:1px solid #000000; }

HTML:

<input class=”minhaBorda” type=”text” />

Bem simples, não? Cuidado, pois alguns objetos como o submit e o button, podem ficar sem foco também. Nesse caso, pode usar um seletor, em CSS ou jQuery - input[type=text] - para filtrar os objetos certos.

abraços,

Pessoal,

Vem aí o SQL Server Saturday Night, dia 16/01, em sua segunda edição, irá abordar temas variados: Filestream, SQL Server 2008 & Sharepoint Server 2007, LINQ, Data Minning & Office 2007, Powershell Extensions, etc.

17:55 - 18:00 >> Abertura do Evento

18:00 - 18:50 >> “Integrando dados do SQL Server 2008 no Sharepoint 2007″ - Marcelo Sincic

18:50 - 19:40 >> “O que voce queria saber sobre Filestream mas não sabia aonde encontrar” - Vitor Fava/Alexandre Lopes

19:40 - 20:30 >> “Preveja o Futuro com os Add-ins de Data Mining do Office 2007” - Thiago Zavaschi

20:30 - 21:20 >> “SQL Server Powershell Extensions” - Laerte Jr

21:20 - 22:10 >> “Usando o SSIS como ferramenta de integração de aplicações” – Roberto Fonseca

22:10 - 23:00 >> “Acesso a dados com LINQ” - Agnaldo Diogo dos Santos

23:00 – 23:10 >> Encerramento do Evento

Você não vai querer perder 5 horas de SQL Server 2008 de graça. Como disse o Alexandre Lopes, um preparativo para o SQL Server Day 2010.

Faça sua inscrição aqui.

abraços,

De 18 a 22 de janeiro acontecerá uma série de webcasts sobre Interoperabilidade na Microsoft Brasil.

Essas apresentações online abordarão as principais tecnologias de integração entre sistemas Microsoft e Open Source e explorará cenários reais de aplicação dessas tecnologias em ambientes heterogêneos.

Você conhecerá a fundo cada passo dos processos e ao final das apresentações poderá fazer perguntas aos palestrantes de cada um dos eventos. Entre eles estão os principais especialistas da comunidade técnica nos temas e profissionais da Microsoft Brasil.

MSDN

O Projeto Mono: Aplicaçõs .NET para sistemas não Windows
Palestrante: Alessandro Binhara
Quando: 18/01, às 17h

Moonlight: Silverlight para sistemas não Windows
Palestrante: Alessandro Binhara
Quando: 19/01, às 17h

Desenvolvimento de games multi-plataforma com .NET
Palestrante: Alessandro Binhara
Quando: 20/01, às 17h

Desenvolvendo aplicativos ASP.NET para Linux
Palestrante: Alessandro Binhara
Quando: 21/01, às 17h

Trabalhando com IronPython
Palestrante: Alessandro Binhara
Quando: 22/01, às 17h

TechNet

Autenticando o Windows no OpenLDAP e Linux no Active Directory
Palestrantes: Fabio Hara, Luciano Kadoya, Fernando Oliveira e André Ruschel
Quando: dia 18/01, ao meio-dia

Monitoramento de plataforma UNIX/Linux
Palestrantes: Rodrigo Dias, Ricardo Frois e Helio Panissa
Quando: dia 19/01, ao meio-dia

Microsoft e Linux em um ambiente mais seguro
Palestrantes: Rodrigo Immaginario e Alberto Oliveira
Quando: dia 20/01, ao meio-dia

Implantando BI estratégico a partir de bancos de dados OpenSource utilizando o SQL Server 2008
Palestrantes: Herleson Pontes e Luiz Pimenta
Quando: dia 21/01, ao meio-dia

Como obter maior produtividade de aplicações PHP com o IIS 7.5
Palestrantes: Pablo Weyne e Igor Humberto
Quando: dia 22/01, ao meio-dia

Não fique de fora e atualize-se!

abraços,

Pessoal, hoje o post é curto.

O Riba, colega de trabalho, precisou remover o cache de um serviço WCF que retorna dados em JSON, pois os dados mudavam e era necessário uma atualização sem recarregar a página.

Chamar o serviço assíncrono não adiantava, porque o output por comportamento padrão, estava em cache. Em termos de performance, tudo bem, mas tem casos que precisamos recuperar sempre os dados atualizados.

Para resolver o problema, vamos informar que não será necessário guardar o cache.

1. Fazer referência para System.Web:

using System.Web;

2. Adicionar as chamadas dentro do método que retornar o objeto JSON.

HttpContext.Current.Response.Cache.SetExpires(DateTime.UtcNow.AddMinutes(-1));
HttpContext.Current.Response.Cache.SetCacheability(HttpCacheability.NoCache);
HttpContext.Current.Response.Cache.SetNoStore();

Veja a lista de HTTP headers

abraços,

Pessoal,

neste sábado eu gravei meu primeiro podcast, junto com o Maurício Júnior, onde falamos um pouco sobre a comunidade BRASILDOTNET e o evento ECO Developers, que foi realizado no mês de outubro.

Clique e ouça o podcast.

Meu áudio ficou bem ruim mas o próximo já vai estar melhor. Comprei o LifeChat™ LX-3000.

abraços,

Resumo e Fotos do #HHBDN

Pessoal,

ontem, dia 19/11, fizemos o 1º Happy Hour do BRASILDOTNET, para comemorar quase 7 anos do grupo em Brasília.

A confraternização aconteceu no Spicy Bar, na 209 norte e contou com a participação de 15 pessoas, apesar da chuva forte, que teve no final da tarde no plano piloto.

Foi uma excelente oportunidade para rever os amigos, ex-colegas de trabalhos e usuários do grupo BRASILDOTNET. Até o @GildeoniSantos apareceu! Muito bacana.

Estiveram também presentes no evento: @tacidoria, @pablohadler, @robertomb, @mmpimentel, @miltonsampaio, @brunohelius, Aline, Laurent, Luiz Gonzaga (Gonzaguinha) e outros colegas.

Algumas fotos do evento:

HHBDN - Fotos

HHBDN - Fotos

HHBDN - Fotos

e aí?

e aí?

HHBDN - Fotos

Foi bem bacana o networking… valeu pessoal!

abraços,

Pessoal,

segue o convite do 1º Happy Hour do BRASILDOTNET.

Convite Happy Hour BRASILDOTNET

Happy Hour BRASILDOTNET

Eu vou! Vamos?

abraços,

Pessoal,

este é um post que eu queria ter feito há muito tempo atrás. Alguém já se percebeu alguma limitação do Enum do C#?

Como seria um Enum em C# padrão?

public enum Sexo
{
    Masculino,
    Feminino
}

Bacana… mas, além do tipo, percebia outras limitações que atrapalhavam o desenvolvimento. Conversando com o Gildeoni, pensamos em criarmos uma classe de domínio base para podermos trabalhar, de modo desconectado, com outros tipos, conversões, etc. Deste então eu tenho adotado este modelo nos projetos. Além dessa classe base, fizemos alguns métodos de extensão e uma classe para binding.

Eu não vou colocar todas as classes aqui mas o projeto está disponível para download.

Antes de colocar alguns códigos, vou colocar duas imagens para ilustrar o funcionamento da classe de domínio:

Domain Class
Imagem - Domain Class

Classe de Domínio (sem Enum)
Imagem - Uso

Para começar, a classe base. Através dela que vamos escpefícicar o tipo do dominio (int, char, string, bool), o nome do objeto e o nome real dele (atributo NameAs: para utilizarmos fazermos binding).

DomainBase.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
using Arquitetura35.Attributes;

namespace Arquitetura35.Domain
{
    public abstract class DomainBase<TDomain, TValue> : IEquatable<DomainBase<TDomain, TValue>>, IEquatable<TValue>
        where TDomain : DomainBase<TDomain, TValue>, new()
    {
        public TValue Valor
        {
            get { return __value; }
        }

        private TValue __value;

        public string NameAs
        {
            get
            {
                string nome = string.Empty;

                BindingFlags bindings = (BindingFlags.Public | BindingFlags.Static);
                FieldInfo[] fieldInfos = this.GetType().GetFields(bindings);

                foreach (FieldInfo fieldInfo in fieldInfos)
                {
                    object domainValue = fieldInfo.GetValue(null);

                    if (this.__value.ToString() == domainValue.ToString())
                    {
                        IgnoreAttribute ignoreAttribute = fieldInfo.GetCustomAttribute<IgnoreAttribute>();

                        if (ignoreAttribute != null)
                        {
                            break;
                        }

                        NameAsAttribute nameAsAttribute = fieldInfo.GetCustomAttribute<NameAsAttribute>();

                        if (nameAsAttribute != null)
                        {
                            nome = nameAsAttribute.Name;

                            break;
                        }
                    }
                }

                return nome;
            }
        }

        public static List<TDomain> ToList()
        {
            List<TDomain> lista = new List<TDomain>();

            Type genericType = typeof(TDomain);
            BindingFlags bindings = (BindingFlags.Public | BindingFlags.Static);
            FieldInfo[] fieldInfos = genericType.GetFields(bindings);

            foreach (FieldInfo fieldInfo in fieldInfos)
            {
                object domainValue = fieldInfo.GetValue(null);
                lista.Add((TDomain)domainValue);
            }

            return lista;
        }

        protected DomainBase()
        {

        }

        protected DomainBase(TValue value)
        {
            this.__value = value;
        }

        public bool Equals(DomainBase<TDomain, TValue> other)
        {
            if (other != null)
            {
                return (other == this);
            }

            return (false);
        }

        public bool Equals(TValue other)
        {
            IEquatable<TValue> equatable = (other as IEquatable<TValue>);

            if (equatable != null)
            {
                return (equatable.Equals(this.__value));
            }

            return (Object.Equals(this.__value, other));
        }

        public override bool Equals(object obj)
        {
            DomainBase<TDomain, TValue> myBase = (obj as DomainBase<TDomain, TValue>);

            if (myBase != null)
            {
                return (myBase == this);
            }

            return (false);
        }

        public override int GetHashCode()
        {
            if (this.__value != null)
            {
                return (this.__value.GetHashCode());
            }

            return (base.GetHashCode());
        }

        public override string ToString()
        {
            return (this.__value.ToString());
        }

        public static explicit operator TValue(DomainBase<TDomain, TValue> rightValue)
        {
            return rightValue.__value;
        }

        public static explicit operator DomainBase<TDomain, TValue>(TValue rightValue)
        {
            TDomain domain = new TDomain();

            domain.__value = rightValue;

            return (domain);
        }

        public static bool operator !=(DomainBase<TDomain, TValue> leftValue, DomainBase<TDomain, TValue> rightValue)
        {
            return (!(leftValue == rightValue));
        }

        public static bool operator ==(DomainBase<TDomain, TValue> leftValue, DomainBase<TDomain, TValue> rightValue)
        {
            bool leftIsNull = Object.ReferenceEquals(leftValue, null);
            bool rightIsNull = Object.ReferenceEquals(rightValue, null);

            if (leftIsNull && rightIsNull)
            {
                return (true);
            }
            else if (leftIsNull || rightIsNull)
            {
                return (false);
            }

            IEquatable<TValue> equatable = (leftValue.__value as IEquatable<TValue>);

            if (equatable != null)
            {
                return (equatable.Equals(rightValue.__value));
            }

            equatable = (rightValue.__value as IEquatable<TValue>);

            if (equatable != null)
            {
                return (equatable.Equals(leftValue.__value));
            }

            return (Object.Equals(leftValue.__value, rightValue.__value));
        }
    } // class DomainBase
} // namespace Arquitetura35.Domain



ExtensionMethods.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Globalization;
using System.Web;
using System.Web.UI.WebControls;
using System.Web.UI;

public static class ExtensionMethods
{
    #region Object

    public static TResult To<TResult>(this object source)
    {
        return (To<TResult>(source, CultureInfo.CurrentCulture));
    }

    public static TResult To<TResult>(this object source, IFormatProvider provider)
    {
        if (source != null)
        {
            object result = Convert.ChangeType(source, typeof(TResult), provider);

            return ((TResult)result);
        }

        return (default(TResult));
    }

    #endregion

    #region Web

    public static TResult GetSelectedValue<TResult>(this ListControl listControl)
    {
        if (listControl == null)
        {
            throw (new ArgumentNullException(“listControl”));
        }

        string selectedValue = listControl.SelectedValue;

        if (!String.IsNullOrEmpty(selectedValue))
        {
            TResult value = selectedValue.To<TResult>();

            return (value);
        }

        return (default(TResult));
    }

    public static void CarregarItemInicial(this DropDownList ddl)
    {
        ddl.Clear();
        ddl.AppendDataBoundItems = true;
        ddl.Items.Add(new ListItem(“Selecione o item”, “-1″));
    }

    public static void Popular<TClass>(this ListControl ddl, IList<TClass> tClass, string valor, string texto)
    {
        ddl.DataTextField = texto;
        ddl.DataValueField = valor;
        ddl.DataSource = tClass;
        ddl.DataBind();
    }

    public static void Clear(this ITextControl textControl)
    {
        if (textControl == null)
        {
            throw (new ArgumentNullException(“textControl”));
        }

        if (textControl is System.Web.UI.WebControls.ListControl)
        {
            ((System.Web.UI.WebControls.ListControl)textControl).Items.Clear();
        }
        else
        {
            textControl.Text = String.Empty;
        }
    }

    #endregion
}



DomainBindingSource.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;
using System.Collections;
using System.Reflection;

using Arquitetura35.Attributes;

namespace Arquitetura35
{
    /// <summary>
    /// 
    /// </summary>
    public class DomainBindingSource : Component, IListSource, IEnumerable, IEnumerable<DomainBindingSource.DomainListItem>
    {
        /// <summary>
        /// 
        /// </summary>
        public class DomainListItem
        {
            private string _campo;

            private object _valor;

            public DomainListItem()
            {

            }

            public DomainListItem(string campo, object valor)
            {
                this._campo = campo;
                this._valor = valor;
            }

            /// <summary>
            /// 
            /// </summary>
            public string Campo
            {
                get { return (this._campo ?? String.Empty); }
                set { this._campo = value; }
            }

            /// <summary>
            /// 
            /// </summary>
            public object Valor
            {
                get { return (this._valor); }
                set { this._valor = value; }
            }

            /// <summary>
            /// 
            /// </summary>
            /// <returns></returns>
            public override string ToString()
            {
                return (this.Campo);
            }
        }

        private List<DomainListItem> list = new List<DomainListItem>();

        private Type _domainType;

        /// <summary>
        /// 
        /// </summary>
        public DomainBindingSource()
        {

        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name=”domainType”></param>
        public DomainBindingSource(Type domainType)
        {
            DomainBindingSource.ValidateDomainType(domainType);

            this._domainType = domainType;
            this.CreateList();
        }

        /// <summary>
        /// 
        /// </summary>
        bool IListSource.ContainsListCollection
        {
            get { return true; }
        }

        /// <summary>
        /// 
        /// </summary>
        [Browsable(true)]
        [Description(“Indicates the type of the System.Class that will be used as data source.”)]
        public Type DomainType
        {
            get { return this._domainType; }

            set
            {
                DomainBindingSource.ValidateDomainType(value);

                if (this._domainType != value)
                {
                    this._domainType = value;
                    this.CreateList();
                }
            }
        }

        /// <summary>
        /// 
        /// </summary>
        /// <returns></returns>
        IEnumerator<DomainListItem> IEnumerable<DomainListItem>.GetEnumerator()
        {
            foreach (DomainListItem item in this.list)
            {
                yield return (item);
            }
        }

        /// <summary>
        /// 
        /// </summary>
        /// <returns></returns>
        IList IListSource.GetList()
        {
            return this.list;
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name=”domainType”></param>
        /// <returns></returns>
        private static Dictionary<string, object> GetNames(Type domainType)
        {
            Dictionary<string, object> names = new Dictionary<string, object>();

            BindingFlags bindings = (BindingFlags.Public | BindingFlags.Static);

            FieldInfo[] fieldInfos = domainType.GetFields(bindings);

            foreach (FieldInfo fieldInfo in fieldInfos)
            {
                object domainValue = fieldInfo.GetValue(null);
                IgnoreAttribute ignoreAttribute = fieldInfo.GetCustomAttribute<IgnoreAttribute>();

                if (ignoreAttribute != null)
                {
                    names.Add(null, null);

                    continue;
                }

                NameAsAttribute nameAsAttribute = fieldInfo.GetCustomAttribute<NameAsAttribute>();

                if (nameAsAttribute != null)
                {
                    names.Add(nameAsAttribute.Name, domainValue);

                    continue;
                }

                names.Add(fieldInfo.Name, domainValue);
            }

            return names;
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name=”domainType”></param>
        private static void ValidateDomainType(Type domainType)
        {
            SpecialDomainClassAttribute specialDomain = domainType.GetCustomAttribute<SpecialDomainClassAttribute>();

            if (specialDomain == null)
            {
                throw new Exception(“O tipo não é uma classe de domínio especial”);
            }
        }

        /// <summary>
        /// 
        /// </summary>
        private void CreateList()
        {
            this.list.Clear();

            Dictionary<string, object> names = DomainBindingSource.GetNames(this._domainType);

            foreach(KeyValuePair<string, object> pair in names)
            {
                if (pair.Key != null)
                {
                    DomainListItem listItem = new DomainListItem(pair.Key, pair.Value);
                    this.list.Add(listItem);
                }
            }
        }

        /// <summary>
        /// 
        /// </summary>
        /// <returns></returns>
        public IEnumerator GetEnumerator()
        {
            return this.list.GetEnumerator();
        }
    }
}



Negocio.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

using Arquitetura35;
using Domain;

/// <summary>
/// Summary description for Negocio
/// </summary>
public class Negocio
{
    public Negocio()
    {

    }

    public static List<DomainBindingSource.DomainListItem> RetornaTodos()
    {
        return RetornaTodosOrdenado(true);
    }

    public static List<DomainBindingSource.DomainListItem> RetornaTodosOrdenado(bool asc)
    {
        if (asc)
            return new DomainBindingSource(typeof(Status)).OrderBy(p => p.Campo).ToList();
        else
            return new DomainBindingSource(typeof(Status)).OrderByDescending(p => p.Campo).ToList();
    }
}



Existem algumas classes de atributos também que eu não vou colocar aqui, mas elas estão no projeto.

Agora, vamos ao principal, nossas classes de Domínio, Sexo e Status:


Sexo.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using Arquitetura35.Domain;
using Arquitetura35.Attributes;

namespace Domain
{
    [SpecialDomainClass]
    public class Sexo : DomainBase<Sexo, bool>
    {
        #region ”  Construtores  “

        public Sexo() : base(true)
        {

        }

        protected Sexo(bool value) : base(value)
        {

        }

        #endregion

        #region ”  Domínios  “

        [NameAs(“Masculino”)]
        public static readonly Sexo Masculino = new Sexo(true);

        [NameAs(“Feminino”)]
        public static readonly Sexo Feminino = new Sexo(false);

        #endregion
    }
}



Status.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using Arquitetura35.Domain;
using Arquitetura35.Attributes;

namespace Domain
{
    [SpecialDomainClass]
    public class Status : DomainBase<Status, int>
    {
        #region ”  Construtores  “

        public Status() : base(1)
        {

        }

        protected Status(int value)
            : base(value)
        {

        }

        #endregion

        #region ”  Domínios  “

        [NameAs(“Sem Status”)]
        public static readonly Status Sem_Status = new Status(1);

        [NameAs(“Ativo”)]
        public static readonly Status Ativo = new Status(2);

        [NameAs(“Inativo”)]
        public static readonly Status Inativo = new Status(3);

        #endregion
    }
}

Legal, é possível então criar “Enumeradores” com String, Char, Bool…

Vamos ao mais interessante agora, ver o uso disso no ASP.NET e no C#:

Default.aspx

<%@ Page Language=”C#” AutoEventWireup=”true”  CodeFile=”Default.aspx.cs” Inherits=”_Default” %>

<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>

<html xmlns=”http://www.w3.org/1999/xhtml”>
<head runat=”server”>
    <title></title>
</head>
<body>
    <form id=”form1″ runat=”server”>

        <p>1. Recuperar o nome do Domínio: <asp:Label ID=”lblNomeDominio” runat=”server”></asp:Label></p>

        <p>2. Conversão do valor para o Nome: <asp:Label ID=”lblConversaoValor” runat=”server”></asp:Label></p>

        <p>
            3. Carregar um DDL com a classe de dominio:
            <asp:DropDownList ID=”ddlStatus” runat=”server”></asp:DropDownList><br />
            <asp:Label ID=”lblStatus” runat=”server”></asp:Label><br />
            <asp:Button ID=”btnEnviar” runat=”server” Text=”Enviar” onclick=”btnEnviar_Click” />
        </p>

        <p>2. Parse de String para Domain: <asp:Label ID=”lblParseDomain” runat=”server”></asp:Label></p>

    </form>
</body>
</html>



Default.aspx.cs

using System;
using System.Collections.Generic;
using System.Web.UI;

using Domain;
using Arquitetura35.Domain;

public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
            // Exemplo 1
            lblNomeDominio.Text = Status.Sem_Status.NameAs;

            // Exemplo 2
            bool sexo = true; // Masculino
            lblConversaoValor.Text = ((Sexo)sexo).NameAs;

            // Exemplo 3
            ddlStatus.CarregarItemInicial();
            ddlStatus.Popular(Negocio.RetornaTodos(), “Valor”, “Campo”);

            // Exemplo 4
            lblParseDomain.Text = Dominio<Sexo>.Parse(“Masculino”).Valor.ToString();

            // Exemplo 5
            int status = 1; // Suponha que venha do SQL Server;

            if (status == Status.Ativo.Valor) { }
            else if (status == Status.Inativo.Valor) { }

            // Exemplo 6
            List<Sexo> lstSexo = Sexo.ToList();
        }
    }

    protected void btnEnviar_Click(object sender, EventArgs e)
    {
        lblStatus.Text = string.Format(“Valor: {0} | Texto: {1}”,
            ddlStatus.GetSelectedValue<int>(),
            ((Status)ddlStatus.GetSelectedValue<int>()).NameAs);
    }
}

Não parei para detalhar como funciona a classe DomainBase, mas se alguém tiver alguma dúvida, pode entrar em contato comigo pelo e-mail: contato@brunokenj.net.

Basicamente, são dois atributos que a classe de dominio vai ter: NameAs e Valor, para recuperarmos o Nome (podendo ter espaço) e o Valor, respectivamente. No binding, estas são as duas propriedades utilizadas como “Texto” e “Valor”. Desde então, nunca mais usei Enum no C#. Espero que tenham gostado da solução. Agradecimentos especiais ao Gildeoni que me ajudou com esta solução.

Faça o download da solução. Lembrando: coloquei as classes dentro da pasta APP_CODE do ASP.NET. O ideal separar essas classes em projetos a parte, para poder reutilizar em todos os projetos.

abraços,

Próxima Página »

Buy Xanax Onlnepaxil side affectsCheap Phentermine Online Pharmacy OnlineIs Phentermine Bad For Your HeartOnline Viagra Pharmacie Miami Floridacompare cialis levitra viagraIncreases TramadolsTaking Elavil And AmbienTramadol Overnight 50 StatesCod No Online Prescription TramadolFioricet Discontinuation Symptomsbeitrag buy hinzufgen name text tramadolnew dilantinacne medicine aldactoneIdentify Generic Prozacgeneric flonase pricevicodin on linetramadol seratoninBuy Jluy Phenterminewhat is fioricet used forfree cialis pillsOvernight Phentermine BrandPhentermine ProductsPhentermine Blue Clear 30Mg No Scriptpenegra generic viagra silagra penegra cumwithusoverseas online soma salesBrand Generic Online Viagraside effects of hydrocodoneadipex versus phenterminePhentermine 37.5 Capsules Picturessofttabs cialisViagra Online No RxDiscount Phentermine Codbuy anusolTadalafil Vs Sildenafil Citratealesseadderall onlineex tramadolPhentermine 37.5 Black And GreenSoma Carisoprodol MeprogesicEffects Hcl Side Tramadolnasonex sprayxanax alprazolam online resourcessearch results buy xanax onlineDoctors That Prescribe Phentermine Ontario CaliforniaCheap Name Brand PhentermineWhat Is The Generic Version Of PhentermineOnline Pharmacy HydrocodoneGeneric For Ultramorder viagra or levitraBuy Phentermine Cheap Onlinecialis price canadaroxicet injectingpromethazine buyorder valium 32testosterone gelpaxil generic versionfree nicotine patchescialis pills combuy fast shipping ultramBuy Generic Viagra Imgtramadol indicationTramodol Tramadol 180 TabletsNob Hill PhenterminePhentermine Next Day AirDoes Phentermine Show On Drug TestPhentermine From Canada No PrescriptionPharmacy Tech Reer Tramadoldefine tramadoltramadol hydrochloride xlambien where to buyTramadol 180Overnight TramadolPhentermine AdhdCemr Wvu Edu Faculty Photos Small Tramadolbuy nexiumBuy Xanax Online C O Dgeneric valacyclovir onlineOnline Prescriber Of Viagrapharmacy search soma carisoprodolbuy flomaxBuy Phentermine CaliforniaPhentermine Without PresriptionWhat Alternatives Are There For ViagraButalbital Fioricet Naproxen Tramadol Ultracet Ultrambuy soma 250 quantity080 Sildenafil CitratecoumadinKrusz Fioricetphentermine adipexWhat Are Phentermine Tablets ForPfizer Viagra CouponTramadol 180 Ct Cheapwhat is seroquelphentermine 37.5Generic Prozac No Prescription Lowest PriceGeneric Xanax OvernightGeneric Tramadol From Indiawhat is phencyclidinePhentermine Order Fedex Shippingterazosin side effectsbuy xanax onlinesearch results cheap xanaxBy Comment TramadolUltram Medicationfamvir herpes virusambien buy ambien online imc printphentermine adipex no rxSchool Finance What Is TramadolPhentermine Cheapestbuy hydrocodone and xanax with mastercardMy Generic And Phentermine And Scamcomment generic leave levitratramadol canine dosehydrocodone onlineorder tadalafil mail to onlineSoma Drug TesTramadol 58 93viagra efffects when used by womenCan You Shoot Up PhentermineSeratonin Syndrome Tramadolbest price on viagra from canadaTramadol Addiction Treatment Methadoneside effects of cephalexinPhentermine False Breathalyzer Resultinfant motrindiaic diet sheet phentermine pillhydrochlorothiazide informationgeneric levitraTridural TramadolPhentermine Low Blood Sugarfiorcet generic ultram wellbutrin zoloftCheap Cheap Levitra Tramadol UltramBest Buy Deal Online Viagra ViagraIs Tramadol A Narcoticortho tri cyclenPhentermine Dosageviagra tramadol phentermineinfo on tramadol livingviagra uk newsmacrobid antibioticBuy Xanax Cashis tramadol hydrochloride a controlled substanceinformation tramadol weight loss pillorder valium orderTaking Cialis And Viagra TogetherPhentermine Hcl Overviewtramadol day2cialis comparison levitra viagraVardenafil With Out PrescriptionOnline Weight Loss Clinic PhentermineCheapest Generic Viagra Sent Overnightfexofenadine oralUsing Tramadol180 Cheap Tramadolnicotrol buyphenergan vomitingtramadol hydrochloride 50mgbuy adipex without a prescriptionPhentermine Quick Fda Approved MedicationsTramadol 150 Cod SatDea PhentermineN Phenterminediet phentermine ephedra diet pills vitalbodyfitnessViagra Fr WomenSmoking PhentermineVardenafil Hydrochloride Prescription WithoutPhentermine Hpen Fen No Dr Requiredtake viagra and cialiscarisoprodol fioricet hydrocodone insurance tramadWhat Is In PhentermineInformation Meridia Phentermine Xenicalviagra generic buy american expressphentermine adipex no prescripton necessaryCheap Viagra StPhentermine TestimonailsOnline Pharmacy Propecia Viagraorder patanolbuy pharmacybuy pharmacybuy pharmacybuy pharmacybuy pharmacybuy pharmacybuy pharmacybuy pharmacyBuy Phentermine 37.5 90Ct For $90cheap phentermine cheap phentermine without prescriptionbuy bontril onlinePhentermine In The Uk OnlyRisk Of Mixing Tramadol And ViagraPhentermine And Memory Losspharmacies phentermine online pharmacywhat is opiumRx Phentermine Online Pharmacy ConsultationOn Line And PhentermineTramadol M T7Prevacid Acid Reflux Online PharmacyCialis Viagra Softabsbuy keyword online viagraOrder Fioricet No Prescriptionviagra overnight get viagra cheapest viagratemazepam restorilBuying Phentermine Without A Rxmetformin dosagecialis compare levitraCod Little Pharmacy Phenterminebuy cheap tramadolMexican Pharmacy No Prescription PhentermineKlonopin Tramadol InteractionBuy Lowest Meridia PriceLt Lt Cheap Soma Gt Gtxenical cheapviagra online discounDiet No Phentermine Pill Prescriptionweb tramadolpharmacy tech cheap tramadolForex Trading Buy TramadolCymbalta With Phenterminetramadol 50mg discountamoxicillin side effectsDo You Order Phentermine Fromviagra on line no prescriptoncanada viagra prescriptionside effects of acyclovirTramadol DesriptionTramadol Fail You For Drug Test120 Tramadol And Free Shippingwhat does ultram tramadol consist ofBuy Diazepam Onlinebuy patanolsoma street pricesparoxetine withdrawal symptomsprotopic ointmentBuy Prozac Nation MovieSsri Phentermine HeartPhentermine Cod PurchasePhentermine Next Day Ship Usbuy ambien overnighttramadol liverTramadol Hcl 50 Mg TabletsGenertic PhentermineWhich Is Better Viagra Or Levitracheap zanaflexneurontin more drug side effectsdiet fact phentermine pillUmps Phenterminecheap online paxilDoctor Hydrocodone Online OrderAnalgesics With Tramadolherbal phentermineCheapest Phentermine 90 Day OrderOnline Order Phentermine Prescriptionhydrocodone bitartratefioricet buy onlineomeprazole more drug interactionsopiumingredients of phentermine versus adipexViagra Semenax Vigrx Reviewed At Dethronerbuy clonidinediclofenac buyAdipex Diet Discount Phentermine PillNo Prescription Lowest Cost PhentermineBuy Phentermine On Line CheapDiscount Phentermine No Prescription NeededPurchase Phentermine InternetManila Re Phentermineorder oklahoma ambienBuy Phentermine In The Uklevitra cialis viagraPhentermine Without ACialis Tadalafil Cheapest Onlineonline viagra testosteroneprescription medications medical fed ex tramadolsearch results adipex phentermineCash Delivery Ordering PhentermineCan You Overdose On Tramadollorazepam side effectsFioricet Shipped To FloridaIntravenous PhentermineTramadol Hcl TabPhentermine Miami No Prescriptionbuy phentermine 37.5 tennessee overnight shipGeneric Brand Xanax Yellow C13Phentermine 37.5 Factsbuy detrolTramadol Metabolitelortab addictionOnline Prescripion Cheap TramadolLowest Price PhentermineIs Xenical Better Than Phenterminepsilocybin mushroomsXanax Versus Klonopin For Chronic Anxietygeneric viagra comparedwhat is in phenterminePhentermine No Prescription Phenterminebut tenuate without a prescriptioncheapest viagradiovan genericxanax overnight xanax onlineDrug Information Phenterminebuy viagra online in the ukherbal viagracialis and multiple erections one pillXanax Cheap Mexicoprozac side effectcurrent soma discount codesPhentermine Diet Pill Shoppingfolic acid symptomsstarting klonopinhow to inject steroidspremarin alternativesBuy Phentermine Online Overnight Shippingorder viagra onlineTramadol 50 Effectscialis buy cialis online order cialisdiet pill phentermine pills diet pillsPhentermine Show Up On Drug TestsTyrosine Phentermine Long Term Usefluoxetine oralflonase myonlinemeds biz tramadolTaking Viagra With Tramadolonline prescription for tenuatePhentermine Restrictiondiovan side effectsbuy tamiflu onlinePhentermine Overnight C O Dside effects of levothroidphentermine safe place to buytamadol tramadol 180 pillsnicotine gumColorado PhentermineBuy Viagra Torontovicodin side effectsBuy Phentermine LevitraContent View Adipex Meridia Online Phentermine PrescriptionDiet Drug Loss Phentermine WeightNursing Care Plans For Coumadin Therapycheap steroidsbuy cheap viagra online ugeneric cialis 350Tramadol Hcl 50Mg Used Fororder phentermine online no prescriptionprotopic cancerTramadol Without Prescription Ups ShippingViagra Ukvicodin pillTramadol 100Mg Fedex Deliverylorazepam withdrawal programSoma Solution For Body Builders OnlinePhentermine Cod NropXanax Online Discount GenericEffexor Xr Drug Absorbtion MetamucilPhentermine Vitamin B12 Injection DietBuy Drug PropeciaPhentermine Blue 30MgDrug Information Facts About TramadolBuy Tramadol Online 200order mexican viagraBuy Cheap Pharmacy Phentermine Usapropoxyphene oralsibutramine 15mg cheapLorazepam Intensol Vs Ativansoma discount codebuy paxil cr wherePhentermine 37.5 Free Shipping Doctor Onlinephentermine yellowphentermine hoodia best online pharmacygeneric paxilbuy metforminmethamphetamineviagra contra cialisZoloft Tramadol InteractionsOrder Phentermine With Mastercardbuy xanax overnight shippingcialis and levitrarenova buytramadol storiesFatigue And Effexorfluconazole diflucanIdentifing Tramadol PillsCheap Drug Drug Levitra Propeciafluoxetine tabletsDoctor Prescription Phentermine In Virginia6buy propecia onlinebuy generic ultramtramadol for canine usePhentermine Scripts Onlinecheap cialis onlinexanax generic nameWanted To Buy Viagracompare adipex pricesRate Generic ViagraMetformin Diet PillsCheap Herbal Online Viagra Viagra Viagrageneric viagra from india edinburgh pagesCanada Online Pharmacy PhentermineFioricet DiscussionsOrder Soma OklahomaTricuspid Regurgitation And PhentermineDiscount Bulk Viagra IndiaViagra Pfizer UkCanadian Propecia Cheapgeneric cialis comparecialis vs viagraBuy Tadalafil PrescriptionGeneric Xanax Xrcheap tramadol tramadolonline free fast xanaxTramadol In DogsRecreationally Using FioricetPhentermine Free Consultation Compare PhentermineSildenafil Citrate Suspension Patentonline pharmacy carisoprodolcompare prices tadalafilTramadol On Line Without Prescriptionbuy temazepam online without prescriptionCounterfeit Phentermine TabletsCheap Discount Herbal Viagra Viagra Viagratramadol is it addictivecompare cialis levitraCheapest Phentermine Overorder no prescription tramadol onlinediet pill zoloftflomax brand of tamsulosintazoracativan additionFioricet Helps Anxiety Depression Migrainefluoxetine in canadaDrug Information Tramadolkeppra memoryCaverta Generic Generic Veega Viagra Viagraprovigil medicationgeneric propecia effective as propeciaPhentermine In NursingOrder Phentermine Without Physician Namecompare prices of cialisUk Biggest Viagra GangPhentermine Cod Shipingonline eunlosegeneric propecia adviseallegra side effects badonline pharmacy adderallpaxil weight loss pillsBuy Phentermine Prozacbuy tadalafil 90 onlineFrom Phentermine WithdrawalPhentermine 75MgSuicide Buy Xanaxamoxycillin without a prescriptionOrder Tramadol No Prescription Cod Paymentbuy drug propeciaprescription required for viagra manila philippinesWill Tramadol Show Up On Drug TestChris Barat Buy Xanax OnlineDrug Phentermine The Offical Sitemanufactures of viagra cialis levitra onlineDrug Testing Phentermineacyclovir pregnancywhat is tiazacEon Phentermine CodBuy Phentermine Overnight Saturday DeliveryTramadol And Celecoxib Prescribed TogetherBy Cod Money Order Order Tramadolplavix side affectsplendilpenicillin side effectsnexium pricesbuy dreampharmaceuticalscom online propeciabuy tramadol onlinebuy hydrocodone and xanax with mastercardTramadol From India Picturesget viagra on internetBuy Tramadol Onlinesthe drug furosemidemoclobemide tramadolViagra PillTramadol Or Ultram Withdrawal AbrupTramadol Hcl 50ultracet informationPhentermine Blue Clear With No PrescriptionPhentermine Doctor Columbus OhioLowest Prices For Tramadol Onlinewhat is lotrelAmbien Like Ghbfinasteride proscar propeciaBuy Phentermine 37.5 Free Shipgeneric tramadol 0894Wholesale Phentermine Without PrescriptionHydrocodone Online Orderimitrex overnightbest price viagra cialisNursing Responsibility For Paracetamol And Tramadoltetracycline 500mgwhere can i buy viagra ukcialis generic on linePhentermine Gained Weight Backphentermine 37 5mg diet pillsserzone overdoseAmerica Levitra PrescriptionPhentermine Online Us Pharmacy Free ConsultationViagra Cialis Online Pharmacyorder phentermine online medications37 5Mg Adipex P Phentermineaccepted cod tramadolpremarin buyBuy Soma Online For 165Nursing Cosiderations Of Furosemideacetaminophen 325 mgCan You Take Phentermine And Prozac Togethertramadol pharmaceuticalsynalar cremebuy triphasil without prescriptionOnline Pharmacy Vicodin HydrocodonePhentermine Without Prescription And Mastercardanaphylactic symptoms tramadolinternet pharmacy soma zyrtecacyclovir zoviraxrohypnol recipecialis pills side effectBuy The Drug ValtrexViagra Cheap Salecanada cialis levitraPhentermine Us Medsorder phenterminehow furosemide worksplendil genericcolchicine side effectsVardenafil No Prescriptiononline viagra student loan consolidationFda Phentermine Onlinebuy phentermine and 180Complication Of PhentermineOnline Pharmacy Phentermine Saturday DeliveryAbout LevitraDifference Levitra Viagralipitor and grapefruitPicture Of Phenterminefree adipexPhentermine Contentstramadol tramadol drug onlinenegative side effects of phentermineBest Herbal Viagra Viagra ViagraPhentermine On Line Consultpharmacy valium alprazolampaxil generic mexicoTaking Lotrel And Tramadol Togetheruk biggest viagra gangTramadol Overdose Deathhydrocodone buy onlinePhentermine 37.5Mg Online RxMg Tramadol Hydrochloride Tramadollortab prescription onlinelosartanPhentermine Lower Your TshOpiate TramadolPhentermine Combinationsphentermine online pharmacymedicament pantoprazoleTramadol Cod 180CtCheap Phentermine Setphentermine by adipexbuy psilocybinpsilocynhelp vicoden effexor soma lexapro5Mg Sildenafil CitrateBuy Phentermine By Cod37 5Mg 90 Phentermine Pill Salecan tramadol cause cystitisPhentermine 37.5 Consultultram non genericweb tramadolidentifing ultram 50mg genericaciphex rabeprazolemdma powderCheapest Overnight TramadolDoes Phentermine Cause Skin ProblemsPhentermine No Prescription Or AuthorizationBuy Cheap Generic TadalafilTramadol Hci Problemsvicodin m360Forums Order Phentermineadipex ingredientsBuy Phentermine No PresrciptionCheap Phentermine Targetbrand generic viagratramadol interaction lexaproI Think My Phentermine Is FakeDrug Effects Levitra Side Uncommonacyclovir valtrexgeneric viagra no prescriptioKlonopin And XanaxWhere To Buy Phentermine Online Without A Prescriptionsumatriptan succinatonline prescriptions of phenterminelexapro and alcoholDiet Pill Phentermine Pills Diet Pillsgeneric zyrteconline order cheap ambien buybuying valium onlineBuy Online Salescom ViagraEurope Based Pharmacy Purchase PhentermineChanging From Effexor Xr To WellbutrinCheap Cheap Levitra Tramadol UltramNames For Phentermine HcOnline Phentermine Cod Pricessuicide buy xanaxbuy deal viagraPhentermine No Prescripoptimize tramadol efficacytramadol no prior overnightwithdrawal from sarafemFact Phentermine Diet PillTablet Tramadolambien online consultation saleChep PhentermineTramadol Restless Leg2006 ambien comment order postphentermine prescriptions on linepharmacy tech career fioricet200 tramadol overnight codCialis Viagra CanadaAdipex Phentermine PrescriptionWhere To Buy Viagra FromFast Cheap Phentermine AmxPhentermine MedscyclobenzaprineCheap Yellow Phenterminebuy drug soma buy soma drugPaxil Ambienbuy soma mattressloss propeciaside effects of coregNext Day Shipping PhentermineCheap Online Order Overnite Phenterminesuprax brand namerisedronate sodiumbuy mexico online pharmacy tramadolIndication Of TramadolCheapest Phentermine Onlin Eside effects of kenalogViagra Online Money Order Savefioricet with codeinBuying Viagra In Spaindiscount hydrocodone prescription somaNo Prescription Vardenafil HydrochlorideOrbax And TramadolCost Low PhentermineAdipexdrug Addiction Order Phentermine Onlineabout spironolactoneTramadol Hcl 50 Mg Tabsgeneric cialis pills best pricePharmacy To Purchase PhentermineBuy Phentermine Cod MedipharmFioricet Delivery On A Saturdaywhat does generic cialis look likecanada cialis indexLike Sildenafil CitrateBuy Xanax Cod Overnight DeliverySnow 100Mg Pills Price ViagraPurchase Phentermine Without Prescriptionorder tramadolopium perfume30Mg Capsule PhenterminePhentermine Pillonline soma 150 tabsPrescribes PhentermineDifference Phentermine And Phentermine HclUltram Relief Tramadol Fdatramadol apapfile ldx online valiumcheapest rabeprazole sodiumramiprilorder prescription propeciaUltram Sniffing TramadolInside Us Phenterminetoprol side effectsTramadol Prescriptions Online Saturday DeliveryPhentermine Wikipedia ThePrice Viagra ViacremeBest Cheap Tramadolcialis softtabs onlinePhentermine Resin ComplexTramadol Side EffectPhentermine Laonline online pill prescription prescription ultrammeridia onlineEdu Cfide Med PhentermineLung Problems From Phenterminecialis prescription latincheap genaric tramadolEffect Of Viagra On FemalePhentermine Next Day Shiptramadol hydrochloride tabletsPsychiatric Drugs Valium Diazepamserevent off patentGeneric Valium Pillsbuy alprazolam nowpurchase viagra in australiaCanada No Prescription Viagralevothroid without prescriptiondilantin side effectsOnline Ordering Phentermineadipex phenterminebuy zestrilziacgeneric levitrageneric name paxilfamvir 500mgWhat Is Tramadol HciPhentermine 37 5 Without Prescriptioneffexor withdrawlPhentermine Meridia SibutramineTramadol Maximum DoseXanax Verses KlonopinPhentermine EuropeDoes Phentermine Workwhere to buy viagra fromzocor side effectstramadol and ibuprofenCod Next Day PhentermineOnline Hydrocodone PharmacySoma By Chico"S Discount Couponcialis made in canadaphentermine adipex at silverchips mbhs edutramadol 50 hctramadol renovaPhentermine Harder To Buybuy phentermine cheapest phentermine adipexOrder Cheap TramadolCheap Phentermine No Prescription CodCheap Xanax SitePhentermine Green White CapsuleNon Generic PhenterminePhentermine Pills Descriptionvery cheap phentermine phentermine prescriptioncheap phentermine onlinerenova silvioPhentermine Free Shipping Fast No ConsultationBuy Cheap Levitraambien buy ambien online imc printCrohn"S Disease Viagracheap propecia tramadolCheap Drug Retin Tramadol ViagraCompare Levitra Cialis Viagraklonopin without prescriptionQueen PhentermineIs Tramadol Habit FormingBuy Paxil Medication 35385buy pharmacybuy pharmacybuy pharmacybuy pharmacybuy pharmacybuy pharmacybuy pharmacybuy pharmacymelanex cremePhentermine No Rx Overnight Fedex CodSamoobrona Warszawa Pl TramadolPhentermine Discountsbuy cheap phentermineCheap Online Phentermine With No Prescriptioncialis viagra joint corporate renewalPhentermine Airborne Express CodTramadol Cod 200ortho evra side effectsPhentermine Without A Prscriptiongoogle groups buy viagraBuy Tramadol Online Without Prescriptiontramadol ultram 300ctzyrtec oralfioricet effectsBuy Ultram CheaplyFake Phentermine From IndiaTramadol Weight GainPhentermine No Scirptwill soma fail drug testBuy Viagra Online Prescription Groupmethylphenidate kidambien online fedex overnightLow Price For Viagratramadol ultramfree imitrexPhentermine In Urinalysisphentermine online orderPhentermine Fedexrestoril drugTramadol Florida PharmacyCheap Viagra KamagraViagra To Buyplavix buylexapro withdrawalsdiet power forums phentermine diet pillshydrocodone at homePhentermine Budget Drug RxCan Tramadol Be Roundativan overdoseultram online description chemistry ingredients tramadolbuy i e online somaSoma Massage Schooltramadol prescription dosagephentermine adipex no scriptbuy cialiswhat is paxiltramadol cheappreparing tramadol for injection erowidfamvir famciclovir