Desenvolvedores.Net - TechBlog

Category Archives: C#

Controlando Threads com Semáforos (C#)

9
1 Estrela2 Estrelas3 Estrelas4 Estrelas5 Estrelas (4 votos, média: 4,00 de 5)
Loading...
21 de abril de 2011

Neste artigo irei abordar como podemos controlar as nossas threads em C#, seqüência de execução e controlar o número de threads que podemos executar, por vez, em nossa aplicação .

Para isso vou falar da classe Semáforo, namespace System.Threading.Semaphore.

Primeiro vamos estudar um pouco esta classe.

Podemos usar a classe semáforo para controlar um pool de threads em nossa aplicação, para isso existem 2 métodos que devemos entender, WaitOne() e Release().

WaitOne()

Este método deverá ser chamado logo no começo, para que a thread atual só entre em execução quando a outra thread estiver terminado.
Este método indica ao semáforo  que existe uma thread aguardando a execução e incrementa a contagem dentro do semáforo.

Release()

Este método deve ser chamado sempre que um thread for finalizada, ou quando se desejar liberar para que outra thread possa entrar em execução. Este método decrementa a contagem do semáforo;

 

Não existe uma garantia de que as threads serão executadas em FIFO (PEPS – Primeiro que Entra Primeiro que Sai) ou LIFO (UEPS – Ultimo que Entra Primeiro que Sai). Para isso temos que ter um controle das nossas threads.

A classe semáforo também não garante que ao chamar o método WaitOne() ou Release() a thread realmente possa ser executada.

Exemplo:

Se pegarmos duas threads X e Y, para a execução de Y temos que esperar X terminar. Caso haja algum erro em X e o método Release() não for chamado a thread Y nunca será executada.

Outro caso:

Para a execução de Y temos que esperar a thread X terminar, mas chamamos o método Release() logo no começo da thread e não no final. Isto fará com que a thread Y seja executada mesmo antes do término da thread X.

Outro erro que podermos ter é, se definirmos o nosso semáforo com o tamanho de três threads por execução e chamarmos o método Release() por mais de três vezes a exceção SemaphoreFullException será lançada.

Bom, chega de conversa. Vamos ver um código de exemplo.

No código abaixo irei mostrar como chamar as threads em ordem e aleatórias.

using System;
using System.Threading;
using System.Collections;
using System.Collections.Generic;

public class ExemploSemaforo
{
    //vamos usar um semáforo para limitar as threads.
    private static Semaphore Pool;

    //este flag é apenas para indicar que estamos na thread desordenada.
    // então temos que chamar o waitOne nos métodos
    private static bool flag = false;

    public static void Main()
    {
        Console.WriteLine("Programa Iniciado");

        ThreadOrdenada();

        ThreadAleatoria();

        Console.WriteLine("Aguarde as threads serem executadas");

        Console.ReadKey();
    }

    /// <summary>
    /// este método irá executar as threads em ordem de criação
    /// </summary>
    private static void ThreadOrdenada()
    {
        Console.WriteLine("Threads Ordenadas");

        //este buffer será criado para garantir que as threads
        //sejam executadas na ordem em que foram chamadas (criadas)
        //iremos usar ele mais abaixo para iniciar as nossas threads
        Queue<Thread> ThreadBuffer = new Queue<Thread>();

        //iniciamos o Pool

        //o primeiro parâmetro do Pool indica quantas threads temos liberadas para iniciar
        //o segundo parâmetro indica quantas threads podemos executar por vez
        Pool = new Semaphore(0, 1);

        //criando um Pool de threads que chamam o MetodoUm
        for (int i = 0; i < 5; i++)
        {
            Thread t = new Thread(new ThreadStart(MetodoUm));
            t.Name = "MetodoUm_Thread#" + i;
            ThreadBuffer.Enqueue(t);
        }

        //criando um Pool de threads que chamam o MetodoDois
        for (int i = 0; i < 5; i++)
        {
            Thread t = new Thread(new ThreadStart(MetodoDois));
            t.Name = "MetodoDois_Thread#" + i;
            ThreadBuffer.Enqueue(t);
        }

        //agora iremos iniciar todas as threads
        while (ThreadBuffer.Count > 0)
        {
            Thread t = ThreadBuffer.Dequeue();
            t.Start();

            //espera o fim da thread anterior para continuar
            //resolvi esperar aqui para garantir que qualquer thread que for executada
            //irá esperar a outra terminar.
            //se tirarmos esta linha as threads nao terão uma ordem definida para executar.
            Pool.WaitOne();//comente este linha e execute o programa novamente. Atente aos erros
        }
    }

    /// <summary>
    /// Este método chama as threads em qualquer ordem
    /// </summary>
    private static void ThreadAleatoria()
    {

        Console.WriteLine("Threads Aleatórias");

        flag = true;

        //iniciamos o Pool

        //o primeiro parâmetro do Pool indica quantas threads temos liberadas para iniciar
        //o segundo parâmetro indica quantas threads podemos executar por vez

        //repare que aqui, diferente da thread ordenada
        //o primeiro parâmetro é 3 para indicar que temos posições livres
        //o segundo é três para indicar que podemos executar até 3 por vez
        Pool = new Semaphore(3, 3);

        //criando um Pool de threads que chamam o MetodoUm
        for (int i = 0; i < 5; i++)
        {
            Thread t = new Thread(new ThreadStart(MetodoUm));
            t.Name = "MetodoUm_Thread#" + i;
            t.Start();
        }

        //criando um Pool de threads que chamam o MetodoDois
        for (int i = 0; i < 5; i++)
        {
            Thread t = new Thread(new ThreadStart(MetodoDois));
            t.Name = "MetodoDois_Thread#" + i;
            t.Start();
        }
    }

    private static void MetodoUm()
    {
        try
        {
            if (flag) Pool.WaitOne();

            Console.WriteLine("A thread " + Thread.CurrentThread.Name + " iniciou.");
            //espera 3 segundos antes de terminar
            Thread.Sleep(3000);

            if (Thread.CurrentThread.Name == "MetodoUm_Thread#1")
                throw new Exception("erro apenas para mostrar que não podemos esquecer de liberar o semáforo mesmo \nque haja erros...");

            Console.WriteLine("A thread " + Thread.CurrentThread.Name + " finalizou.");
        }
        catch (Exception ex)
        {
            Console.ForegroundColor = ConsoleColor.Red;
            Console.WriteLine(ex.Message);
            Console.ResetColor();
        }
        finally
        {
            //temos que sinalizar que a thread terminou.
            //isso é muito importante, não podemos esquecer, pois caso contrário
            //as outras threads não serão executadas
            Pool.Release();
        }
    }

    private static void MetodoDois()
    {
        try
        {
            if (flag) Pool.WaitOne();

            Console.WriteLine("A thread " + Thread.CurrentThread.Name + " iniciou.");
            //espera 3 segundos antes de terminar
            Thread.Sleep(3000);
            Console.WriteLine("A thread " + Thread.CurrentThread.Name + " finalizou.");

        }
        catch (Exception ex)
        {
            Console.ForegroundColor = ConsoleColor.Red;
            Console.WriteLine(ex.Message);
            Console.ResetColor();
        }
        finally
        {
            //temos que sinalizar que a thread terminou.
            //isso é muito importante, não podemos esquecer, pois caso contrário
            //as outras threads não serão executadas
            Pool.Release();
        }

    }
}

É isso ai pessoal 🙂
Até o próximo
♦ Marcelo

About Marcelo

Nascido em Juruaia/MG em uma fazenda de criação de búfalos, e residindo na região Sul do Brasil. Trabalha com desenvolvimento de aplicações desde os 17 anos. Atualmente é Arquiteto Organizacional na Unimake Software. Para saber mais ... http://desenvolvedores.net/marcelo []'s

Checar se a conexão com a internet está ativa

1
1 Estrela2 Estrelas3 Estrelas4 Estrelas5 Estrelas (4 votos, média: 5,00 de 5)
Loading...
22 de março de 2011
Eu desenvolvi uma aplicação onde necessitava verificar a conexão com a internet, se estava ativa ou não, caso contrário a aplicação iria parar.Para verificar se a conexão com a internet está ativa podemos usar a API InternetGetConnectedState. Mais informações sobre a API e o parâmetro “Description” em
http://msdn.microsoft.com/en-us/library/aa384702(VS.85).aspx

Usando API:

[DllImport("wininet.dll")]
private extern static bool InternetGetConnectedState(out int Description, int ReservedValue);

/// <summary>
/// verificar se está conectado à internet
/// </summary>
/// <returns>true se existir uma conexão</returns>
/// <remarks>retornar true não quer dizer que o destino esteja alcançável, utilize
/// IsReachable(url) para saber se o destino está alcançável</remarks>
public static bool IsConnectedToInternet()
{
	int Desc;
	bool ret = InternetGetConnectedState(out Desc, 0);
	return ret;
}

Mas neste caso se o método retornar true, isso não quer dizer que realmente podemos acessar o endereço web que precisamos. Por exemplo: Podemos estar conectados por um servidor proxy, onde precisamos fazer uma autenticação.

Neste caso temos que validar se nosso destino está alcançável, acessível.
Veja como:

/// <summary>
/// verifica se o destino informado está alcançável. (Acessível)
/// </summary>
/// <param name="_url">endereço URL</param>
/// <returns>true se estiver alcançável</returns>
public static bool IsReachable(string _url)
{
	System.Uri Url = new System.Uri(_url);

	System.Net.WebRequest webReq;
	System.Net.WebResponse resp;
	webReq = System.Net.WebRequest.Create(Url);

	try
	{
		resp = webReq.GetResponse();
		resp.Close();
		webReq = null;
		return true;
	}
	catch
	{
		webReq = null;
		return false;
	}
}

Se este método retornar true, aí sim podemos dizer que nossa aplicação tem acesso a internet.
Veja um exemplo em uma aplicação console.

static void Main(string[] args)
{
	if (IsConnectedToInternet())
	{
		Console.WriteLine("Conectado a internet");

		//mas...
		//estarmos conectado não quer dizer que podemos acessar o endereço que desejamos
		//para isto temos que validar se nosso destino é alcançável.
		if (IsReachable("http://desenvolvedores.net"))
			Console.WriteLine("temos acesso ao site http://desenvolvedores.net");
		else
			Console.WriteLine("não temos acesso ao site http://desenvolvedores.net");
	}
	else
		Console.WriteLine("Não está conectado a internet");

	Console.ReadKey();
}

Você poderia modificar a rotina IsConnectedToInternet e nela mesmo já validar se a conexão realmente está ativa. Para isso pode se usar um site que você tem certeza que estará sempre online. (Google, Microsoft, Desenvolvedores.net).

Veja a nova versão.

/// <summary>
/// verificar se está conectado a internet
/// </summary>
/// <returns>true se existir uma conexão</returns>
/// <remarks>retornar  true não quer dizer que o destino esteja alcançável, utilize
/// IsReachable(url) para saber se o destino está alcançável</remarks>
public static bool IsConnectedToInternet()
{
	int Desc;
	bool ret = InternetGetConnectedState(out Desc, 0);

	if (ret)
		ret = IsReachable("http://desenvolvedores.net");

	return ret;
}

É isso ai pessoal 🙂
Até o próximo
♦ Marcelo

: C#

About Marcelo

Nascido em Juruaia/MG em uma fazenda de criação de búfalos, e residindo na região Sul do Brasil. Trabalha com desenvolvimento de aplicações desde os 17 anos. Atualmente é Arquiteto Organizacional na Unimake Software. Para saber mais ... http://desenvolvedores.net/marcelo []'s

MaskedNumber em C-Sharp

0
1 Estrela2 Estrelas3 Estrelas4 Estrelas5 Estrelas (1 votos, média: 5,00 de 5)
Loading...
13 de março de 2011
Quando eu precisei de um campo numérico em C#, tentei usar o MaskedTexBox.Eu particularmente não gostei deste componente e neste caso eu reinventei a roda e acabei criando o MaskedNumber.

Eu coloquei alguns tipos já pré-formatados como:
Peso, Valor, Moeda, Porcentagem, Telefone, CPF, CNPJ, CEP e Custom

Pode ser que seja útil pra muita gente, pode ser que não. Mas está aí. Resolvi disponibilizar ele aqui para compartilhar com o pessoal.

Ainda tem alguns errinhos que vou corrigindo aos poucos e se alguém alterar os fontes e quiser me mandar as versões. Eu agradeço.

[]’s

Código do componente

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Windows.Forms;
using System.Threading;

public enum MaskedNumberFormat
{
    Peso,
    Valor,
    Moeda,
    Porcentagem,
    Telefone,
    CPF,
    CNPJ,
    CEP,
    Custom
}

namespace MaskedNumber
{
    public partial class MaskedNumber : System.Windows.Forms.TextBox
    {
        #region Construtores
        public MaskedNumber()
        {
            InitializeComponent();
            this.TextAlign = HorizontalAlignment.Right;
            base.KeyPress += new KeyPressEventHandler(MaskedNumber_KeyPress);
            base.LostFocus += new EventHandler(MaskedNumber_LostFocus);
            this.Format = MaskedNumberFormat.Valor;
        }
        #endregion

        #region Eventos
        void MaskedNumber_LostFocus(object sender, EventArgs e)
        {
            this.Refresh();
        }

        void MaskedNumber_KeyPress(object sender, KeyPressEventArgs e)
        {

            switch (e.KeyChar.ToString())
            {
                case ",":
                case ".":
                    e.KeyChar = ',';
                    if (this.Text.Contains(e.KeyChar.ToString()) == true)
                    {
                        e.Handled = true;
                        e.KeyChar = '0';
                    }
                    break;
                case "+":
                    e.Handled = true;
                    e.KeyChar = '0';

                    if (Format == MaskedNumberFormat.Telefone)
                    {
                        if (!this.Text.Contains("+"))
                        {
                            this.Text = "+" + this.Text;
                            this.SelectionStart = this.Text.Length;
                        }
                    }
                    break;

                case "-":
                    e.Handled = true;
                    e.KeyChar = '0';

                    if (Format == MaskedNumberFormat.Moeda ||
                        Format == MaskedNumberFormat.Valor ||
                        Format == MaskedNumberFormat.Porcentagem ||
                        Format == MaskedNumberFormat.Peso)
                    {
                        if (!this.Text.Contains("-"))
                        {
                            this.Text = "-" + this.Text;
                            this.SelectionStart = this.Text.Length;
                        }
                    }
                    break;
                default:
                    if (!char.IsNumber(e.KeyChar) &&    //numero
                        e.KeyChar != '\b')            //backspace
                    {
                        e.Handled = true;
                        e.KeyChar = '0';
                    }
                    break;
            }
        }

        private void MaskedNumber_Enter(object sender, EventArgs e)
        {
            this.SelectAll();
        }

        private void MaskedNumber_Click(object sender, EventArgs e)
        {
            this.SelectAll();
        }
        #endregion

        #region Propriedades
        private MaskedNumberFormat format;
        private String mCustomFormat = "0:0";
        public String CustomFormat
        {
            get
            {
                if (mCustomFormat == null ||
                    mCustomFormat.Length == 0) mCustomFormat = "0:0";
                return mCustomFormat;
            }
            set
            {
                mCustomFormat = value;
                this.Refresh();
            }
        }

        public MaskedNumberFormat Format
        {
            get { return format; }
            set
            {
                format = value;
                this.Refresh();
            }
        }

        public double Value
        {
            get
            {
                double ret = 0;
                double.TryParse(global::MaskedNumber.Format.OnlyNumbers(base.Text).ToString(), out ret);

                //se começar com ( é numero negativo
                if (Format == MaskedNumberFormat.Moeda && base.Text.StartsWith("("))
                    ret *= -1;
                return ret;
            }
        }

        #endregion

        #region Overrides and New
        public override string Text
        {
            get
            {
                return base.Text;
            }
            set
            {
                base.Text = value;
                this.Refresh();
            }
        }

        public override void Refresh()
        {
            switch (Format)
            {
                case MaskedNumberFormat.Peso:
                    base.Text = String.Format("{0:n3}", this.Value);
                    break;
                case MaskedNumberFormat.Valor:
                    base.Text = String.Format("{0:n2}", this.Value);
                    break;
                case MaskedNumberFormat.Moeda:
                    base.Text = String.Format("{0:C}", this.Value);
                    break;
                case MaskedNumberFormat.Porcentagem:
                    base.Text = String.Format("{0:P2}", this.Value / 100);
                    break;
                case MaskedNumberFormat.CPF:
                    base.Text = global::MaskedNumber.Format.CPF(Text);
                    break;
                case MaskedNumberFormat.CNPJ:
                    base.Text = global::MaskedNumber.Format.CNPJ(Text);
                    break;
                case MaskedNumberFormat.CEP:
                    base.Text = global::MaskedNumber.Format.CEP(Text);
                    break;
                case MaskedNumberFormat.Telefone:
                    base.Text = global::MaskedNumber.Format.Telefone(Text);
                    break;
                case MaskedNumberFormat.Custom:
                    base.Text = global::MaskedNumber.Format.Custom(Text, CustomFormat);
                    break;
            }

            base.Refresh();
        }
        #endregion

        #region MaskedNumber.Designer.cs
        /// <summary>
        /// Required designer variable.
        /// </summary>
        private System.ComponentModel.IContainer components = null;

        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        #region Component Designer generated code

        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
            this.SuspendLayout();
            //
            // MaskedNumber
            //
            this.Size = new System.Drawing.Size(150, 20);
            this.Enter += new System.EventHandler(this.MaskedNumber_Enter);
            this.Click += new System.EventHandler(this.MaskedNumber_Click);
            this.ResumeLayout(false);

        }

        #endregion
        #endregion
    }

    /// <summary>
    /// Classe responsável pelas formatações do componente.
    /// </summary>
    internal static class Format
    {
        /// <summary>
        /// Formata o CNPJ
        /// </summary>
        /// <param name="_cnpj">cnpj a ser formatado</param>
        /// <returns>cnpj formatado</returns>
        public static string CNPJ(string _cnpj)
        {
            MaskedTextProvider mascara;
            //cnpj
            //##.###.###/####-##
            mascara = new MaskedTextProvider(@"00\.000\.000/0000-00");
            mascara.Set(_cnpj);
            return mascara.ToString();
        }

        /// <summary>
        /// Formata o CPF
        /// </summary>
        /// <param name="_cpf">CPF a ser formatado</param>
        /// <returns>cpf formatado</returns>
        public static string CPF(string _cpf)
        {
            MaskedTextProvider mascara;
            //cpf
            //###.###.###-##
            mascara = new MaskedTextProvider(@"000\.000\.000-00");
            mascara.Set(_cpf);
            return mascara.ToString();
        }

        /// <summary>
        /// formata o cep e retorna
        /// </summary>
        /// <param name="_cep">cep a ser formatado</param>
        /// <returns>cep formatado como 00000-000</returns>
        public static string CEP(string _cep)
        {
            _cep = OnlyNumbers(_cep).ToString().Replace("-", "");
            _cep = _cep.ToString(null).PadRight(8, '0');
            return _cep.Substring(0, 5) + "-" + _cep.Substring(5, 3);
        }

        /// <summary>
        /// Formata um número de telefone e retorna o numero formatado
        /// </summary>
        /// <param name="value">número de telefone</param>
        /// <returns>telefone formatado</returns>
        public static string Telefone(string value)
        {
            if (String.IsNullOrEmpty(value)) return "";
            string mascara = "";
            value = value.Trim();
            if (value.StartsWith("0800") ||
                value.StartsWith("0300") ||
                value.StartsWith("0500") ||
                value.StartsWith("0900"))
                mascara = @"0000\-000\-0000";
            else if (value.StartsWith("+"))
                mascara = @"+00\(00\)0000\-0000";
            else if (value.Length == 7)
                mascara = @"000\-0000";
            else if (value.Length == 8)
                mascara = @"0000\-0000";
            else if (value.Length == 10)
                mascara = @"\(00\)0000\-0000";
            else if (value.Length == 11)
                mascara = @"\(000\)0000\-0000";
            else if (value.Length == 12)
                mascara = @"00\(00\)0000\-0000";
            else if (value.Length == 13)
                mascara = @"000\(00\)0000\-0000";
            else
                mascara = "0".PadLeft(value.Length, '0');

            MaskedTextProvider maskProvider;

            maskProvider = new MaskedTextProvider(mascara);
            maskProvider.Set(value);

            if (!maskProvider.MaskCompleted)
                return value;

            return maskProvider.ToString();
        }

        public static string Custom(string Text, string CustomFormat)
        {
            MaskedTextProvider mascara;
            mascara = new MaskedTextProvider(CustomFormat);
            mascara.Set(Text);
            return mascara.ToString();
        }

        /// <summary>
        /// extrair todo caracter não numérico do text, deixando apenas a virgula e os números
        /// <para>Permite número negativo</para>
        /// </summary>
        /// <param name="text">texto a ser tratado</param>
        /// <returns></returns>
        public static object OnlyNumbers(object text)
        {
            bool flagNeg = false;

            if (text == null || text.ToString().Length == 0) return 0;
            string ret = "";

            foreach (char c in text.ToString().ToCharArray())
            {
                if (c.Equals('.') == true || c.Equals(',') == true || char.IsNumber(c) == true)
                    ret += c.ToString();
                else if (c.Equals('-') == true)
                    flagNeg = true;
            }

            if (flagNeg == true) ret = "-" + ret;

            return ret;
        }
    }
}

Código do exemplo. Não esqueça de fazer referência ao componente se estiver criando ele em separado.
E não esquecer de colocar na mesma solução para depurar.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace Teste
{
    //iniciar o sistema
    class StartUp
    {
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new frmMain());
        }
    }

    public class frmMain : Form
    {
        public frmMain()
        {
            InitializeComponent();
        }

        private void frmMain_Load(object sender, EventArgs e)
        {
            linkLabel1.Text = "Se vc alterar os fontes e achar que isto foi útil. Não esqueça de enviá-los para mim. :)" + '\r' + '\n';
            linkLabel1.Text += "Visite meu site : http://desenvolvedores.net" + '\r' + '\n';
            linkLabel1.Text += "E-mail : projetos@desenvolvedores.net";

            linkLabel1.Links.Add(108, 26, "http://desenvolvedores.net");
            linkLabel1.Links.Add(145, 51, "mailto:projetos@desenvolvedores.net?subject=MaskedNumber");

        }

        private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            System.Diagnostics.Process.Start(e.Link.LinkData.ToString());
        }

        private void maskedNumber4_TextChanged(object sender, EventArgs e)
        {

        }

        private void maskedNumber4_Enter(object sender, EventArgs e)
        {
            maskedNumber4.Format = MaskedNumberFormat.Custom;
            maskedNumber4.CustomFormat = txtFormatoCustom.Text;
        }

        #region frmMain.Designer
        /// <summary>
        /// Required designer variable.
        /// </summary>
        private System.ComponentModel.IContainer components = null;

        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        #region Windows Form Designer generated code

        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
            this.label1 = new System.Windows.Forms.Label();
            this.label2 = new System.Windows.Forms.Label();
            this.label3 = new System.Windows.Forms.Label();
            this.label4 = new System.Windows.Forms.Label();
            this.label5 = new System.Windows.Forms.Label();
            this.linkLabel1 = new System.Windows.Forms.LinkLabel();
            this.label6 = new System.Windows.Forms.Label();
            this.label7 = new System.Windows.Forms.Label();
            this.txtFormatoCustom = new System.Windows.Forms.TextBox();
            this.label8 = new System.Windows.Forms.Label();
            this.label9 = new System.Windows.Forms.Label();
            this.label10 = new System.Windows.Forms.Label();
            this.label11 = new System.Windows.Forms.Label();
            this.maskedNumber8 = new MaskedNumber.MaskedNumber();
            this.maskedNumber7 = new MaskedNumber.MaskedNumber();
            this.maskedNumber6 = new MaskedNumber.MaskedNumber();
            this.maskedNumber5 = new MaskedNumber.MaskedNumber();
            this.maskedNumber4 = new MaskedNumber.MaskedNumber();
            this.maskedNumber3 = new MaskedNumber.MaskedNumber();
            this.maskedNumber2 = new MaskedNumber.MaskedNumber();
            this.maskedNumber1 = new MaskedNumber.MaskedNumber();
            this.maskedNumberValor = new MaskedNumber.MaskedNumber();
            this.SuspendLayout();
            //
            // label1
            //
            this.label1.AutoSize = true;
            this.label1.Location = new System.Drawing.Point(10, 12);
            this.label1.Name = "label1";
            this.label1.Size = new System.Drawing.Size(72, 13);
            this.label1.TabIndex = 0;
            this.label1.Text = "Formato Valor";
            //
            // label2
            //
            this.label2.AutoSize = true;
            this.label2.Location = new System.Drawing.Point(10, 36);
            this.label2.Name = "label2";
            this.label2.Size = new System.Drawing.Size(111, 13);
            this.label2.TabIndex = 2;
            this.label2.Text = "Formato Porcentagem";
            //
            // label3
            //
            this.label3.AutoSize = true;
            this.label3.Location = new System.Drawing.Point(10, 64);
            this.label3.Name = "label3";
            this.label3.Size = new System.Drawing.Size(72, 13);
            this.label3.TabIndex = 4;
            this.label3.Text = "Formato Peso";
            //
            // label4
            //
            this.label4.AutoSize = true;
            this.label4.Location = new System.Drawing.Point(10, 90);
            this.label4.Name = "label4";
            this.label4.Size = new System.Drawing.Size(81, 13);
            this.label4.TabIndex = 6;
            this.label4.Text = "Formato Moeda";
            //
            // label5
            //
            this.label5.AutoSize = true;
            this.label5.Location = new System.Drawing.Point(10, 315);
            this.label5.Name = "label5";
            this.label5.Size = new System.Drawing.Size(73, 13);
            this.label5.TabIndex = 19;
            this.label5.Text = "Digite o Valor:";
            //
            // linkLabel1
            //
            this.linkLabel1.Location = new System.Drawing.Point(7, 372);
            this.linkLabel1.Name = "linkLabel1";
            this.linkLabel1.Size = new System.Drawing.Size(263, 75);
            this.linkLabel1.TabIndex = 21;
            this.linkLabel1.TabStop = true;
            this.linkLabel1.Text = "linkLabel1";
            this.linkLabel1.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkLabel1_LinkClicked);
            //
            // label6
            //
            this.label6.AutoSize = true;
            this.label6.Location = new System.Drawing.Point(63, 266);
            this.label6.Name = "label6";
            this.label6.Size = new System.Drawing.Size(157, 13);
            this.label6.TabIndex = 16;
            this.label6.Text = "Defina o formato para \"Custom\"";
            //
            // label7
            //
            this.label7.AutoSize = true;
            this.label7.Location = new System.Drawing.Point(10, 290);
            this.label7.Name = "label7";
            this.label7.Size = new System.Drawing.Size(48, 13);
            this.label7.TabIndex = 17;
            this.label7.Text = "Formato:";
            //
            // txtFormatoCustom
            //
            this.txtFormatoCustom.Location = new System.Drawing.Point(121, 286);
            this.txtFormatoCustom.Name = "txtFormatoCustom";
            this.txtFormatoCustom.Size = new System.Drawing.Size(150, 20);
            this.txtFormatoCustom.TabIndex = 18;
            this.txtFormatoCustom.Text = "000,00/00-00";
            //
            // label8
            //
            this.label8.AutoSize = true;
            this.label8.Location = new System.Drawing.Point(10, 200);
            this.label8.Name = "label8";
            this.label8.Size = new System.Drawing.Size(68, 13);
            this.label8.TabIndex = 12;
            this.label8.Text = "Formato CPF";
            //
            // label9
            //
            this.label9.AutoSize = true;
            this.label9.Location = new System.Drawing.Point(10, 226);
            this.label9.Name = "label9";
            this.label9.Size = new System.Drawing.Size(75, 13);
            this.label9.TabIndex = 14;
            this.label9.Text = "Formato CNPJ";
            //
            // label10
            //
            this.label10.AutoSize = true;
            this.label10.Location = new System.Drawing.Point(10, 174);
            this.label10.Name = "label10";
            this.label10.Size = new System.Drawing.Size(69, 13);
            this.label10.TabIndex = 10;
            this.label10.Text = "Formato CEP";
            //
            // label11
            //
            this.label11.AutoSize = true;
            this.label11.Location = new System.Drawing.Point(10, 133);
            this.label11.Name = "label11";
            this.label11.Size = new System.Drawing.Size(93, 13);
            this.label11.TabIndex = 8;
            this.label11.Text = "Formato Telefone:";
            //
            // maskedNumber8
            //
            this.maskedNumber8.CustomFormat = "{0:0}";
            this.maskedNumber8.Format = MaskedNumberFormat.Telefone;
            this.maskedNumber8.Location = new System.Drawing.Point(121, 133);
            this.maskedNumber8.Name = "maskedNumber8";
            this.maskedNumber8.Size = new System.Drawing.Size(150, 20);
            this.maskedNumber8.TabIndex = 9;
            this.maskedNumber8.Text = "0800-123-4567";
            this.maskedNumber8.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;
            //
            // maskedNumber7
            //
            this.maskedNumber7.CustomFormat = "{0:0}";
            this.maskedNumber7.Format = MaskedNumberFormat.CEP;
            this.maskedNumber7.Location = new System.Drawing.Point(121, 174);
            this.maskedNumber7.Name = "maskedNumber7";
            this.maskedNumber7.Size = new System.Drawing.Size(150, 20);
            this.maskedNumber7.TabIndex = 11;
            this.maskedNumber7.Text = "12345-678";
            this.maskedNumber7.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;
            //
            // maskedNumber6
            //
            this.maskedNumber6.CustomFormat = "{0:0}";
            this.maskedNumber6.Format = MaskedNumberFormat.CNPJ;
            this.maskedNumber6.Location = new System.Drawing.Point(121, 226);
            this.maskedNumber6.Name = "maskedNumber6";
            this.maskedNumber6.Size = new System.Drawing.Size(150, 20);
            this.maskedNumber6.TabIndex = 15;
            this.maskedNumber6.Text = "12.345.678/9012-34";
            this.maskedNumber6.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;
            //
            // maskedNumber5
            //
            this.maskedNumber5.CustomFormat = "{0:0}";
            this.maskedNumber5.Format = MaskedNumberFormat.CPF;
            this.maskedNumber5.Location = new System.Drawing.Point(121, 200);
            this.maskedNumber5.Name = "maskedNumber5";
            this.maskedNumber5.Size = new System.Drawing.Size(150, 20);
            this.maskedNumber5.TabIndex = 13;
            this.maskedNumber5.Text = "123.456.789-01";
            this.maskedNumber5.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;
            //
            // maskedNumber4
            //
            this.maskedNumber4.CustomFormat = "000,00/00-00";
            this.maskedNumber4.Format = MaskedNumberFormat.Custom;
            this.maskedNumber4.Location = new System.Drawing.Point(121, 315);
            this.maskedNumber4.Name = "maskedNumber4";
            this.maskedNumber4.Size = new System.Drawing.Size(150, 20);
            this.maskedNumber4.TabIndex = 20;
            this.maskedNumber4.Text = "123.45/67-89";
            this.maskedNumber4.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;
            this.maskedNumber4.TextChanged += new System.EventHandler(this.maskedNumber4_TextChanged);
            this.maskedNumber4.Enter += new System.EventHandler(this.maskedNumber4_Enter);
            //
            // maskedNumber3
            //
            this.maskedNumber3.CustomFormat = "{0:0}";
            this.maskedNumber3.Format = MaskedNumberFormat.Moeda;
            this.maskedNumber3.Location = new System.Drawing.Point(121, 90);
            this.maskedNumber3.Name = "maskedNumber3";
            this.maskedNumber3.Size = new System.Drawing.Size(150, 20);
            this.maskedNumber3.TabIndex = 7;
            this.maskedNumber3.Text = "R$ 1.253,56";
            this.maskedNumber3.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;
            //
            // maskedNumber2
            //
            this.maskedNumber2.CustomFormat = "{0:0}";
            this.maskedNumber2.Format = MaskedNumberFormat.Peso;
            this.maskedNumber2.Location = new System.Drawing.Point(121, 64);
            this.maskedNumber2.Name = "maskedNumber2";
            this.maskedNumber2.Size = new System.Drawing.Size(150, 20);
            this.maskedNumber2.TabIndex = 5;
            this.maskedNumber2.Text = "123,566";
            this.maskedNumber2.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;
            //
            // maskedNumber1
            //
            this.maskedNumber1.CustomFormat = "{0:0}";
            this.maskedNumber1.Format = MaskedNumberFormat.Porcentagem;
            this.maskedNumber1.Location = new System.Drawing.Point(121, 36);
            this.maskedNumber1.Name = "maskedNumber1";
            this.maskedNumber1.Size = new System.Drawing.Size(150, 20);
            this.maskedNumber1.TabIndex = 3;
            this.maskedNumber1.Text = "89,33%";
            this.maskedNumber1.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;
            //
            // maskedNumberValor
            //
            this.maskedNumberValor.CustomFormat = "{0:0}";
            this.maskedNumberValor.Format = MaskedNumberFormat.Valor;
            this.maskedNumberValor.Location = new System.Drawing.Point(121, 12);
            this.maskedNumberValor.Name = "maskedNumberValor";
            this.maskedNumberValor.Size = new System.Drawing.Size(150, 20);
            this.maskedNumberValor.TabIndex = 1;
            this.maskedNumberValor.Text = "34.897,34";
            this.maskedNumberValor.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;
            //
            // frmMain
            //
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(283, 458);
            this.Controls.Add(this.label11);
            this.Controls.Add(this.maskedNumber8);
            this.Controls.Add(this.label10);
            this.Controls.Add(this.maskedNumber7);
            this.Controls.Add(this.label9);
            this.Controls.Add(this.maskedNumber6);
            this.Controls.Add(this.label8);
            this.Controls.Add(this.maskedNumber5);
            this.Controls.Add(this.txtFormatoCustom);
            this.Controls.Add(this.label7);
            this.Controls.Add(this.label6);
            this.Controls.Add(this.linkLabel1);
            this.Controls.Add(this.label5);
            this.Controls.Add(this.maskedNumber4);
            this.Controls.Add(this.label4);
            this.Controls.Add(this.maskedNumber3);
            this.Controls.Add(this.label3);
            this.Controls.Add(this.maskedNumber2);
            this.Controls.Add(this.label2);
            this.Controls.Add(this.maskedNumber1);
            this.Controls.Add(this.label1);
            this.Controls.Add(this.maskedNumberValor);
            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
            this.MaximizeBox = false;
            this.MinimizeBox = false;
            this.Name = "frmMain";
            this.Text = "Exemplo de uso do MaskedNumber";
            this.Load += new System.EventHandler(this.frmMain_Load);
            this.ResumeLayout(false);
            this.PerformLayout();

        }

        #endregion

        private MaskedNumber.MaskedNumber maskedNumberValor;
        private System.Windows.Forms.Label label1;
        private System.Windows.Forms.Label label2;
        private MaskedNumber.MaskedNumber maskedNumber1;
        private System.Windows.Forms.Label label3;
        private MaskedNumber.MaskedNumber maskedNumber2;
        private System.Windows.Forms.Label label4;
        private MaskedNumber.MaskedNumber maskedNumber3;
        private System.Windows.Forms.Label label5;
        private MaskedNumber.MaskedNumber maskedNumber4;
        private System.Windows.Forms.LinkLabel linkLabel1;
        private System.Windows.Forms.Label label6;
        private System.Windows.Forms.Label label7;
        private System.Windows.Forms.TextBox txtFormatoCustom;
        private System.Windows.Forms.Label label8;
        private MaskedNumber.MaskedNumber maskedNumber5;
        private System.Windows.Forms.Label label9;
        private MaskedNumber.MaskedNumber maskedNumber6;
        private System.Windows.Forms.Label label10;
        private MaskedNumber.MaskedNumber maskedNumber7;
        private System.Windows.Forms.Label label11;
        private MaskedNumber.MaskedNumber maskedNumber8;
        #endregion
    }
}

E para quem não quiser copiar e colar o código todo. Ai vai o link da solução para download.
[download id=”13″ format=”1″]

É isso ai pessoal 🙂
Até o próximo
♦ Marcelo

About Marcelo

Nascido em Juruaia/MG em uma fazenda de criação de búfalos, e residindo na região Sul do Brasil. Trabalha com desenvolvimento de aplicações desde os 17 anos. Atualmente é Arquiteto Organizacional na Unimake Software. Para saber mais ... http://desenvolvedores.net/marcelo []'s

Usando dll C# como um ActiveX/DLL

4
1 Estrela2 Estrelas3 Estrelas4 Estrelas5 Estrelas (1 votos, média: 5,00 de 5)
Loading...
25 de fevereiro de 2011
Nem todas as linguagens suportam o acesso às classes, métodos e propriedades das DLL’s criadas em .NET de uma forma “automática”, “nativa”.
Muitas vezes temos a necessidade de disponibilizar estes acessos para linguagens que suportam o uso de ActiveX. (veja: http://pt.wikipedia.org/wiki/ActiveX)E isso é bem simples de se fazer em .NET. Vamos ver como.

Iremos criar um novo projeto do tipo Class Library no Visual Studio eu dei o nome de ActiveX (criativo não?).
Iremos criar uma classe chamada de “MinhaClasse” (minha criatividade para nomes está a mil hoje).
Primeiro vamos ver o código de MinhaClasse
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;

namespace ActiveX
{
    //define o tipo de interface da classe

    [ClassInterface(ClassInterfaceType.AutoDual)]

    //registra um identificador para a classe no registry
    [ProgId("ActiveX.MinhaClasse")]

    //faz com que todos os métodos e propriedades da classe sejam visíveis
    [ComVisible(true)]

    public class MinhaClasse
    {
        private string mPropriedade;

        public string MinhaPropriedade
        {
            get { return mPropriedade; }
            set { mPropriedade = value; }
        }

        public string MeuMetodo()
        {
            return "MeuMetodo";
        }

        //este método eu não quero que seja visível. Então somente pra ele eu uso o comvisible = false
        [ComVisible(false)] //este método não ira aparecer no VB6 por ex.
        public string MeuMetodoOculto()
        {
            return "MeuMetodoOculto";
        }
    }
}
Ok! Feito isso podemos compilar nossa classe, que não irá dar erro, mas também não vai funcionar, temos que marcar um checkBox mágico para que a DLL como um todo seja declarada como ActiveX.
Para isso vá em “Project” -> “Properties” -> Aba “Build” e marque a opção “Register for COM Interop”.
Veja na animação:
Feito isso, compilaremos novamente a nossa DLL. Mas também não iria funcionar só de compilar. 🙂
Como todo bom ActiveX que se preze temos que registrar.
Utilize a seguinte sintaxe:
para registrar :
%windir%\Microsoft.NET\Framework\XXX\RegAsm.exe “Caminho Completo do ActiveX.dll” /tlb
Onde XXX é a versão do seu framework
Pronto, agora sim podemos usar a nossa DLL como um activeX, para isso vamos usar o VBScript para criarmos o objeto e um arquivo HTML com java script como exemplo.
VBScript
Dim activex
set activex = CreateObject("ActiveX.MinhaClasse")
MsgBox activex.MeuMetodo
Agora em HTML com java script

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>

    <script language="javascript" type="text/javascript">
    function Load()
    {
        var activeX;
        activeX = new ActiveXObject("ActiveX.MinhaClasse");
        alert (activeX.MeuMetodo());
    }
    </script>

    <title>Testando ActiveX em .NET</title>
</head>
<body onload="Load();">
</body>
</html>
Este artigo foi apenas uma parte do que se é possível fazer, mas não podemos esquecer dos eventos e interfaces que nossas dlls podem ter.
Mas isso vai ficar para uma próxima vez. 🙂
É isso ai pessoal 🙂
Até o próximo
♦ Marcelo

About Marcelo

Nascido em Juruaia/MG em uma fazenda de criação de búfalos, e residindo na região Sul do Brasil. Trabalha com desenvolvimento de aplicações desde os 17 anos. Atualmente é Arquiteto Organizacional na Unimake Software. Para saber mais ... http://desenvolvedores.net/marcelo []'s

Cast de string para enum em C#

0
1 Estrela2 Estrelas3 Estrelas4 Estrelas5 Estrelas (Sem votação.)
Loading...
22 de dezembro de 2010
Muitas vezes precisamos atribuir a uma propriedade do tipo enum um conteúdo, porem temos em mãos somente uma string com valor a ser atribuito, para realizar esta operação temos que fazer uma conversão ou como é mais conhecido fazer um casting, no qual segue abaixo um código de exemplo:
//Definir nosso enumerador
public enum Sexo
{
   Masculino,
   Feminino
}
//Vamos criar uma propriedade tendo como tipo o nosso enumerador
public Sexo SexoCliente { get; set; }

//Vamos criar uma variável contendo uma string do sexo escolhido
string mSexo = "Masculino";

//Agora vamos atribuir a nossa propriedade SexoCliente o conteúdo da variável mSexo
SexoCliente = (Sexo)Enum.Parse(typeof(Sexo),mSexo);
É isso ai.

Como recuperar a descrição do enumerador partindo do código dele

2
1 Estrela2 Estrelas3 Estrelas4 Estrelas5 Estrelas (1 votos, média: 5,00 de 5)
Loading...
17 de dezembro de 2010

Em muitos casos temos a necessidade de recuperar a descrição de um Enum partindo do código, pois é este que temos gravado em nosso banco de dados, veja como:

//Enumerador de tipos
public enum GenericDBType
{
    Bit = 0,
    String = 1,
    Object = 2,
    Datetime = 3
}
//Digamos que eu tenha gravado no meu banco o código do enumerador
//neste caso vamos eleger o String (código 1), agora eu desejo recuperar
//a descrição do enumerador (String) a partir do código gravado (1).
//É bem simples, veja:
//Código que tá gravado no banco de dados

int codigoGravadoBanco = 1;
//o retorno será "String"

Enum.GetName(typeof(GenericDbType), codigoGravadoBanco); 

É isso ai, bem simples… 🙂

InputBox em CSharp

0
1 Estrela2 Estrelas3 Estrelas4 Estrelas5 Estrelas (Sem votação.)
Loading...
10 de dezembro de 2010

Ola Pessoal.

Neste artigo eu vou falar de uma carência que o C# tem. O InputBox.

O C# não possui um InputBox, logo temos que criar um, aqui vai um código que facilita a vida.

Com este inputBox você pode tratar as teclas pressionadas pelo usuário, bem como modificar o título, o valor inicial, exibir uma mensagem ao usuário.

Bom, vamos deixar de falatório (ou seria escrevetório, nossa forcei agora). E vamos ao que interessa.
Vou assumir que você tem conhecimento em C#.

Crie um novo projeto to tipo Class Lybrary, isso irá criar para você uma DLL.

Na classe que veio como padrão, renomeie para InputBox.cs e utilize o código abaixo para fazer a sua DLL.

Copiar e colar amigável: http://desenvolvedores.net.pastebin.com/raw.php?i=czRKYN7F

Código:

/*
 * Exemplo de inpuBox em C#.
 * By http://desenvolvedores.net
 */
using System;
using System.Windows.Forms;

/*
 * definimos o namespace como System.Windows.Forms apenas
 * para manter no mesmo local que a MessageBox
 */
namespace System.Windows.Forms
{
    #region Formulário
    internal sealed class _InputBox : System.Windows.Forms.Form
    {
        #region Locais
        internal System.Windows.Forms.TextBox txtInput;
        private Button cmdOK;
        private Button cmdCancel;
        internal Label lblUserInfo;
        private System.ComponentModel.Container components = null;

        /// <summary>
        /// tratar os eventos de pressionamento de teclas e develver ao usuário
        /// </summary>
        internal KeyPressEventHandler keyPress = null;
        #endregion

        #region Construtor
        public _InputBox()
        {
            InitializeComponent();
            lblUserInfo.Text = "";
            txtInput.Text = "";
        }
        #endregion

        #region Métodos de criação e dipose do form
        protected override void Dispose(bool disposing)
        {
            if (disposing)
            {
                if (components != null)
                {
                    components.Dispose();
                }
            }
            base.Dispose(disposing);
        }

        private void InitializeComponent()
        {
            this.txtInput = new System.Windows.Forms.TextBox();
            this.cmdOK = new System.Windows.Forms.Button();
            this.cmdCancel = new System.Windows.Forms.Button();
            this.lblUserInfo = new System.Windows.Forms.Label();
            this.SuspendLayout();
            //
            // txtInput
            //
            this.txtInput.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
            this.txtInput.Location = new System.Drawing.Point(16, 16);
            this.txtInput.Name = "txtInput";
            this.txtInput.Size = new System.Drawing.Size(256, 20);
            this.txtInput.TabIndex = 0;
            this.txtInput.KeyDown += new System.Windows.Forms.KeyEventHandler(this.txtInput_KeyDown);
            this.txtInput.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.txtInput_KeyPress);
            //
            // cmdOK
            //
            this.cmdOK.Anchor = System.Windows.Forms.AnchorStyles.Bottom;
            this.cmdOK.Location = new System.Drawing.Point(124, 46);
            this.cmdOK.Name = "cmdOK";
            this.cmdOK.Size = new System.Drawing.Size(71, 26);
            this.cmdOK.TabIndex = 1;
            this.cmdOK.Text = "OK";
            this.cmdOK.UseVisualStyleBackColor = true;
            this.cmdOK.Click += new System.EventHandler(this.cmdOK_Click);
            //
            // cmdCancel
            //
            this.cmdCancel.Anchor = System.Windows.Forms.AnchorStyles.Bottom;
            this.cmdCancel.Location = new System.Drawing.Point(201, 46);
            this.cmdCancel.Name = "cmdCancel";
            this.cmdCancel.Size = new System.Drawing.Size(71, 26);
            this.cmdCancel.TabIndex = 2;
            this.cmdCancel.Text = "Cancelar";
            this.cmdCancel.UseVisualStyleBackColor = true;
            this.cmdCancel.Click += new System.EventHandler(this.cmdCancel_Click);
            //
            // lblUserInfo
            //
            this.lblUserInfo.AutoSize = true;
            this.lblUserInfo.Location = new System.Drawing.Point(16, 0);
            this.lblUserInfo.MaximumSize = new System.Drawing.Size(256, 0);
            this.lblUserInfo.Name = "lblUserInfo";
            this.lblUserInfo.Size = new System.Drawing.Size(140, 13);
            this.lblUserInfo.TabIndex = 3;
            this.lblUserInfo.Text = "XXXXXXXXXXXXXXXXXXX";
            //
            // _InputBox
            //
            this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
            this.ClientSize = new System.Drawing.Size(292, 73);
            this.ControlBox = false;
            this.Controls.Add(this.lblUserInfo);
            this.Controls.Add(this.cmdCancel);
            this.Controls.Add(this.cmdOK);
            this.Controls.Add(this.txtInput);
            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
            this.Name = "_InputBox";
            this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
            this.Text = "InputBox";
            this.TopMost = true;
            this.Shown += new System.EventHandler(this._InputBox_Shown);
            this.ResumeLayout(false);
            this.PerformLayout();

        }
        #endregion

        #region Método Show
        public new string Show()
        {
            base.ShowDialog();
            return this.txtInput.Text;
        }
        #endregion

        #region Tratamento das ações do usuário
        private void txtInput_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
                cmdOK.PerformClick();
            else if (e.KeyCode == Keys.Escape)
                cmdCancel.PerformClick();
        }

        private void cmdCancel_Click(object sender, EventArgs e)
        {
            txtInput.Text = "";
            this.Close();
        }

        private void cmdOK_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void _InputBox_Shown(object sender, EventArgs e)
        {
            //aqui temos que redimensionar o form por causa do tamanho da Label

            txtInput.Top = lblUserInfo.Top + lblUserInfo.Height + 5;
            this.Height = txtInput.Top + txtInput.Height + 60;
        }

        private void txtInput_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (keyPress != null)
                keyPress.Invoke(sender, e);
        }
        #endregion

    }
    #endregion

    #region Classe InputBox
    public static class InputBox
    {
        #region Métodos Show
        /// <summary>
        /// Exibe a inputbox
        /// </summary>
        /// <returns>string digitada</returns>
        public static string Show()
        {
            return InputBox.Show("", "", "", null);
        }

        /// <summary>
        /// Exibe a inputbox
        /// </summary>
        /// <param name="Title">Título desejado</param>
        /// <param name="keyHandler">Delegate tipo KeyPressEventHandler para capturar as teclas pressionadas</param>
        /// <returns>string digitada</returns>
        public static string Show(string Title, KeyPressEventHandler keyHandler)
        {
            return InputBox.Show(Title, "", "", keyHandler);
        }

        /// <summary>
        /// Exibe a inputbox
        /// </summary>
        /// <param name="keyHandler">Delegate tipo KeyPressEventHandler para capturar as teclas pressionadas</param>
        /// <returns>string digitada</returns>
        public static string Show(KeyPressEventHandler keyHandler)
        {
            return InputBox.Show("", "", "", keyHandler);
        }

        /// <summary>
        /// Exibe a inputbox
        /// </summary>
        /// <param name="initalValue">Valor inicial da inputBox</param>
        /// <param name="keyHandler">Delegate tipo KeyPressEventHandler para capturar as teclas pressionadas</param>
        /// <returns>string digitada</returns>
        public static string Show(KeyPressEventHandler keyHandler, string initalValue)
        {
            return InputBox.Show("", "", initalValue, keyHandler);
        }

        /// <summary>
        /// Exibe a inputbox
        /// </summary>
        /// <param name="userInfo">Mensagem inicial</param>
        /// <param name="initalValue">Valor inicial da inputBox</param>
        /// <param name="keyHandler">Delegate tipo KeyPressEventHandler para capturar as teclas pressionadas</param>
        /// <returns>string digitada</returns>
        public static string Show(string userInfo, string initalValue, KeyPressEventHandler keyHandler)
        {
            return InputBox.Show("", userInfo, initalValue, keyHandler);
        }

        /// <summary>
        /// Exibe a inputbox
        /// </summary>
        /// <param name="Title">Título desejado</param>
        /// <param name="userInfo">Mensagem inicial</param>
        /// <param name="initalValue">Valor inicial da inputBox</param>
        /// <param name="keyHandler">Delegate tipo KeyPressEventHandler para capturar as teclas pressionadas</param>
        /// <returns>string digitada</returns>
        public static string Show(KeyPressEventHandler keyHandler, string Title, string userInfo)
        {
            return InputBox.Show(Title, userInfo, "", keyHandler);
        }

        /// <summary>
        /// Exibe a inputbox
        /// </summary>
        /// <param name="Title">Título desejado</param>
        /// <param name="userInfo">Mensagem inicial</param>
        /// <param name="initalValue">Valor inicial da inputBox</param>
        /// <returns>string digitada</returns>
        public static string Show(string Title, string userInfo, string initalValue)
        {
            return InputBox.Show(Title, userInfo, initalValue, null);
        }

        /// <summary>
        /// Exibe a inputbox
        /// </summary>
        /// <param name="Title">Título desejado</param>
        /// <param name="userInfo">Mensagem inicial</param>
        /// <returns>string digitada</returns>
        public static string Show(string Title, string userInfo)
        {
            return InputBox.Show(Title, userInfo, "", null);
        }

        /// <summary>
        /// Exibe a inputbox
        /// </summary>
        /// <param name="Title">Título desejado</param>
        /// <param name="userInfo">Mensagem inicial</param>
        /// <param name="initalValue">Valor inicial da inputBox</param>
        /// <param name="keyHandler">Delegate tipo KeyPressEventHandler para capturar as teclas pressionadas</param>
        /// <returns>string digitada</returns>
        public static string Show(string Title, string userInfo, string initalValue, KeyPressEventHandler keyHandler)
        {
            using (_InputBox input = new _InputBox())
            {
                input.Text = string.IsNullOrEmpty(Title) ? "Infome um valor..." : Title;
                input.lblUserInfo.Text = userInfo;
                input.txtInput.Text = initalValue;
                if (keyHandler != null) input.keyPress = keyHandler;
                return input.Show();
            }
        }
        #endregion
    }
    #endregion
}

Exmplo de uso:
Adicione um novo projeto à sua solução do tipo Windows Forms Application
Faça referência a sua DLL.

Copiar e colar amigável: http://desenvolvedores.net.pastebin.com/raw.php?i=HqxqLyTT

/*
 * Exemplo de uso InputBox C#
 * by http://desenvolvedores.net
 */
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace InputBoxExample
{
    public class frmMain : Form
    {
        public frmMain()
        {
            InitializeComponent();
        }
        private void btnComHandler_Click(object sender, EventArgs e)
        {
            KeyPressEventHandler keyPress = new KeyPressEventHandler(InputBoxKeyPress);
            txtTeclaPressionada.Text = "";
            MessageBox.Show(InputBox.Show(keyPress, "Digite alguma coisa", "O que você digitar aqui irá aparecer na caixa de texto do formulário."));
        }
        private void InputBoxKeyPress(object sender, KeyPressEventArgs e)
        {
            txtTeclaPressionada.Text += e.KeyChar;
        }
        private void btnApenasTestar_Click(object sender, EventArgs e)
        {
            txtApenasTestar.Text = InputBox.Show();
        }
        private void btnValorInicial_Click(object sender, EventArgs e)
        {
            MessageBox.Show(InputBox.Show("Digite alguma coisa", "O que você digitou no textbox irá aparecer no textBox abaixo.", txtValorInicial.Text));
        }
        #region Componentes
        /// <summary>
        /// Required designer variable.
        /// </summary>
        private System.ComponentModel.IContainer components = null;
        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }
        #region Windows Form Designer generated code
        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
            this.btnComHandler = new System.Windows.Forms.Button();
            this.lblTeclaPressionada = new System.Windows.Forms.Label();
            this.txtTeclaPressionada = new System.Windows.Forms.TextBox();
            this.btnApenasTestar = new System.Windows.Forms.Button();
            this.groupBox1 = new System.Windows.Forms.GroupBox();
            this.groupBox2 = new System.Windows.Forms.GroupBox();
            this.label1 = new System.Windows.Forms.Label();
            this.txtApenasTestar = new System.Windows.Forms.TextBox();
            this.groupBox3 = new System.Windows.Forms.GroupBox();
            this.label2 = new System.Windows.Forms.Label();
            this.txtValorInicial = new System.Windows.Forms.TextBox();
            this.btnValorInicial = new System.Windows.Forms.Button();
            this.groupBox1.SuspendLayout();
            this.groupBox2.SuspendLayout();
            this.groupBox3.SuspendLayout();
            this.SuspendLayout();
            //
            // btnComHandler
            //
            this.btnComHandler.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
            this.btnComHandler.Location = new System.Drawing.Point(249, 43);
            this.btnComHandler.Name = "btnComHandler";
            this.btnComHandler.Size = new System.Drawing.Size(250, 32);
            this.btnComHandler.TabIndex = 2;
            this.btnComHandler.Text = "Testar capturando a tecla pressionada";
            this.btnComHandler.UseVisualStyleBackColor = true;
            this.btnComHandler.Click += new System.EventHandler(this.btnComHandler_Click);
            //
            // lblTeclaPressionada
            //
            this.lblTeclaPressionada.AutoSize = true;
            this.lblTeclaPressionada.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
            this.lblTeclaPressionada.Location = new System.Drawing.Point(6, 19);
            this.lblTeclaPressionada.Name = "lblTeclaPressionada";
            this.lblTeclaPressionada.Size = new System.Drawing.Size(108, 13);
            this.lblTeclaPressionada.TabIndex = 0;
            this.lblTeclaPressionada.Text = "Teclas Pressionadas:";
            //
            // txtTeclaPressionada
            //
            this.txtTeclaPressionada.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
            this.txtTeclaPressionada.Location = new System.Drawing.Point(120, 17);
            this.txtTeclaPressionada.Name = "txtTeclaPressionada";
            this.txtTeclaPressionada.Size = new System.Drawing.Size(379, 20);
            this.txtTeclaPressionada.TabIndex = 1;
            //
            // btnApenasTestar
            //
            this.btnApenasTestar.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
            this.btnApenasTestar.Location = new System.Drawing.Point(249, 53);
            this.btnApenasTestar.Name = "btnApenasTestar";
            this.btnApenasTestar.Size = new System.Drawing.Size(250, 32);
            this.btnApenasTestar.TabIndex = 2;
            this.btnApenasTestar.Text = "Apenas Testar";
            this.btnApenasTestar.UseVisualStyleBackColor = true;
            this.btnApenasTestar.Click += new System.EventHandler(this.btnApenasTestar_Click);
            //
            // groupBox1
            //
            this.groupBox1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
                        | System.Windows.Forms.AnchorStyles.Right)));
            this.groupBox1.Controls.Add(this.btnComHandler);
            this.groupBox1.Controls.Add(this.lblTeclaPressionada);
            this.groupBox1.Controls.Add(this.txtTeclaPressionada);
            this.groupBox1.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
            this.groupBox1.Location = new System.Drawing.Point(12, 12);
            this.groupBox1.Name = "groupBox1";
            this.groupBox1.Size = new System.Drawing.Size(511, 91);
            this.groupBox1.TabIndex = 0;
            this.groupBox1.TabStop = false;
            this.groupBox1.Text = "Capturando as Teclas";
            //
            // groupBox2
            //
            this.groupBox2.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
                        | System.Windows.Forms.AnchorStyles.Right)));
            this.groupBox2.Controls.Add(this.label1);
            this.groupBox2.Controls.Add(this.txtApenasTestar);
            this.groupBox2.Controls.Add(this.btnApenasTestar);
            this.groupBox2.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
            this.groupBox2.Location = new System.Drawing.Point(12, 129);
            this.groupBox2.Name = "groupBox2";
            this.groupBox2.Size = new System.Drawing.Size(511, 91);
            this.groupBox2.TabIndex = 1;
            this.groupBox2.TabStop = false;
            this.groupBox2.Text = "Apenas Testar";
            //
            // label1
            //
            this.label1.AutoSize = true;
            this.label1.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
            this.label1.Location = new System.Drawing.Point(6, 21);
            this.label1.Name = "label1";
            this.label1.Size = new System.Drawing.Size(48, 13);
            this.label1.TabIndex = 0;
            this.label1.Text = "Retorno:";
            //
            // txtApenasTestar
            //
            this.txtApenasTestar.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
            this.txtApenasTestar.Location = new System.Drawing.Point(120, 19);
            this.txtApenasTestar.Name = "txtApenasTestar";
            this.txtApenasTestar.Size = new System.Drawing.Size(379, 20);
            this.txtApenasTestar.TabIndex = 1;
            //
            // groupBox3
            //
            this.groupBox3.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
                        | System.Windows.Forms.AnchorStyles.Right)));
            this.groupBox3.Controls.Add(this.label2);
            this.groupBox3.Controls.Add(this.txtValorInicial);
            this.groupBox3.Controls.Add(this.btnValorInicial);
            this.groupBox3.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
            this.groupBox3.Location = new System.Drawing.Point(12, 237);
            this.groupBox3.Name = "groupBox3";
            this.groupBox3.Size = new System.Drawing.Size(511, 91);
            this.groupBox3.TabIndex = 2;
            this.groupBox3.TabStop = false;
            this.groupBox3.Text = "Valor Inicial";
            //
            // label2
            //
            this.label2.AutoSize = true;
            this.label2.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
            this.label2.Location = new System.Drawing.Point(6, 21);
            this.label2.Name = "label2";
            this.label2.Size = new System.Drawing.Size(99, 13);
            this.label2.TabIndex = 0;
            this.label2.Text = "Digite o valor Inicial";
            //
            // txtValorInicial
            //
            this.txtValorInicial.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
            this.txtValorInicial.Location = new System.Drawing.Point(120, 19);
            this.txtValorInicial.Name = "txtValorInicial";
            this.txtValorInicial.Size = new System.Drawing.Size(379, 20);
            this.txtValorInicial.TabIndex = 1;
            //
            // btnValorInicial
            //
            this.btnValorInicial.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
            this.btnValorInicial.Location = new System.Drawing.Point(249, 53);
            this.btnValorInicial.Name = "btnValorInicial";
            this.btnValorInicial.Size = new System.Drawing.Size(250, 32);
            this.btnValorInicial.TabIndex = 2;
            this.btnValorInicial.Text = "Com valor inicial";
            this.btnValorInicial.UseVisualStyleBackColor = true;
            this.btnValorInicial.Click += new System.EventHandler(this.btnValorInicial_Click);
            //
            // frmMain
            //
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(535, 340);
            this.Controls.Add(this.groupBox3);
            this.Controls.Add(this.groupBox2);
            this.Controls.Add(this.groupBox1);
            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
            this.MaximizeBox = false;
            this.MinimizeBox = false;
            this.Name = "frmMain";
            this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
            this.Text = "InputBox em C#";
            this.groupBox1.ResumeLayout(false);
            this.groupBox1.PerformLayout();
            this.groupBox2.ResumeLayout(false);
            this.groupBox2.PerformLayout();
            this.groupBox3.ResumeLayout(false);
            this.groupBox3.PerformLayout();
            this.ResumeLayout(false);
        }
        #endregion
        private System.Windows.Forms.Button btnComHandler;
        private System.Windows.Forms.Label lblTeclaPressionada;
        private System.Windows.Forms.TextBox txtTeclaPressionada;
        private System.Windows.Forms.Button btnApenasTestar;
        private System.Windows.Forms.GroupBox groupBox1;
        private System.Windows.Forms.GroupBox groupBox2;
        private System.Windows.Forms.Label label1;
        private System.Windows.Forms.TextBox txtApenasTestar;
        private System.Windows.Forms.GroupBox groupBox3;
        private System.Windows.Forms.Label label2;
        private System.Windows.Forms.TextBox txtValorInicial;
        private System.Windows.Forms.Button btnValorInicial;
        #endregion
    }
}

Para os mais preguiçosos, faça o download do exemplo completo abaixo:
[download id=”12″]

É isso ai pessoal 🙂
Até o próximo
 ♦ Marcelo

About Marcelo

Nascido em Juruaia/MG em uma fazenda de criação de búfalos, e residindo na região Sul do Brasil. Trabalha com desenvolvimento de aplicações desde os 17 anos. Atualmente é Arquiteto Organizacional na Unimake Software. Para saber mais ... http://desenvolvedores.net/marcelo []'s

Paginação remota com ext.net, CSharp e ASPX

1
1 Estrela2 Estrelas3 Estrelas4 Estrelas5 Estrelas (1 votos, média: 5,00 de 5)
Loading...
8 de dezembro de 2010

Olá Pessoal.

Neste tutorial eu vou escrever e falar  sobre paginação remota utilizando o Ext.Net, C# e ASP.Net.

Antes de começar, uma rápida revisão sobre paginação.

O que é paginação?
Paginação (paginar) consiste em dividir em partes (páginas).
Imagine o jornal que você lê, ele é dividido em páginas para que facilite a sua leitura, você pode virar as páginas ou ir para uma página específica do seu jornal e continuar a sua leitura, o mesmo acontece com livros, revistas etc.

Agora vamos imaginar a paginação dos dados.
Quando você abre um conjunto de registros, a exibição ao usuário pode se tornar lenta, se o número de registros for grande, neste momento você precisa paginar o seu conjunto de registros, ou tupla se você preferir.

Uma tupla é cada linha de registro de uma tabela na base de dados

A idéia de paginar os seus registros é o mesmo que o jornal faz, dividir e exibir o todo em partes.

Agora vamos ao que interessa.

No ext.net existe o componente PagingToolbar

<ext:PagingToolbar></ext:PagingToolbar>

Ele é o responsável pela interface ao usuário e por gerar os eventos necessários para a paginação.

Como tudo acontece.

Quando você clica no botão de navegação o ext envia uma requisição ao servidor, passando como parâmetros no Request as seguintes variáveis start e limit

Estas duas variáveis são responsáveis por dizer onde começa e qual o tamanho da página.

Ok! Mas como o ASPXvai capturar estas informações?

Para tratarmos estes eventos dentro do ASPX temos que usar handlers.

Opa! O que são handlers?

Os handlers são responsáveis por interceptar solicitações feitas ao servidor de aplicativo.
Eles são executados como processos em resposta a um pedido feito pelo site.

Você pode criar seus próprios handlers genéricos (ashx) que processam a saída e enviam ao navegador.

Para programar um handler genérico o mesmo deverá implementar a interface System.Web.IHttpHandler.
As interfaces exigem que você implemente o método ProcessRequest e a propriedade IsReusable.

O método ProcessRequest manipula o processamento para as solicitações feitas, enquanto o booleano IsReusable é a propriedade que diz se o manipulador é reutilizável ou se um novo manipulador é necessário para cada solicitação.

Declaração básica para um handler genérico:

Diretiva de página:
<%@ WebHandler Language=”C#Class=”DeclaracaoBasica %>

Código da página

using System;
using System.Web;
public class DeclaracaoBasica : IHttpHandler {
    public void ProcessRequest (HttpContext context) {
        context.Response.ContentType = "text/plain";
        context.Response.Write("Hello World");
    }
    public bool IsReusable {
        get {
            return false;
        }
    }
}

Bom, agora que temos os pré-requisitos vamos à nossa vídeo-aula clique no vídeo abaixo e assista.

O som do vídeo está baixo, recomendo o uso de um fone de ouvido.

YouTube responded to TubePress with an HTTP 410 - No longer available

Se preferir, assista direto no youtube http://www.youtube.com/watch?v=BjFpW-Mg-bg&hd=1

Download do código de exemplo:
[download id=”11″]

Dúvidas? Poste-as no fórum referindo-se a este tutorial.
http://desenvolvedores.net/ext.net

É isso ai pessoal 🙂
Até o próximo
♦ Marcelo

About Marcelo

Nascido em Juruaia/MG em uma fazenda de criação de búfalos, e residindo na região Sul do Brasil. Trabalha com desenvolvimento de aplicações desde os 17 anos. Atualmente é Arquiteto Organizacional na Unimake Software. Para saber mais ... http://desenvolvedores.net/marcelo []'s
Page 4 of 4«1234