Desenvolvedores.Net - TechBlog

Tag Archives: C#

Criando métodos no lado Cliente/Servidor (DirectMethod)

0
1 Estrela2 Estrelas3 Estrelas4 Estrelas5 Estrelas (Sem votação.)
Loading...
18 de junho de 2014

DirectMethod

Para um melhor entendimento deste Artigo veja o Índice (Rich Internet Applications com Ext.Net)

Criando métodos no lado Cliente/Servidor (DirectMethod)

Como vimos, os DirectEvents são extremamente poderosos, são inseridos no controle, lançados no lado cliente e executados no lado servidor.

Com todo este poder de trabalhar do lado cliente integrando ao lado servidor, temos os “DirectMethods“.

note-taking Logo, podemos definir que “DirectMethods” são métodos em .NET definidos no servidor que podemos chama-los no lado cliente pelo javascript.

Vejamos dois exemplos:

Chamando pelo Handler

ASPX Code

<ext:Button ID="Button1" runat="server" Text="Que horas são?" Icon="Clock">
	<Listeners>
		<Click Handler="App.direct.ShowServerTime();">
		</Click>
	</Listeners>
</ext:Button>

Code Behind

[DirectMethod]
public void ShowServerTime()
{
	X.MessageBox.Show(new MessageBoxConfig
	{
		Buttons = MessageBox.Button.OK,
		Title = "Server Time",
		Message = "No servidor são exatamente " + DateTime.Now.ToLongTimeString(),
		Icon = MessageBox.Icon.INFO
	});
}

Chamando pelo ponteiro (Fn)

ASPX Code

<script type="text/javascript" src="../Scripts/DirectMethods.js"></script>
<ext:Button ID="Button2" runat="server" Text="Que horas são?" Icon="Clock">
	<Listeners>
		<Click Fn="MyApp.showTime">
		</Click>
	</Listeners>
</ext:Button>

Crie um arquivo javascript e cole seguinte código no seu arquivo:

/**
<pre> Arquivo de definição dos objetos em javascript
 */

// definir o namespace de base para a aplicação
var MyApp = {};

MyApp.showTime = function() {
    App.direct.ShowServerTime();
};

Vamos analisar agora os pontos importantes do código que foi montado.
Primeiro vamos pegar a definição do método “public void ShowServerTime()” nele temos a definição do atributo  “[DirectMethod]“.

O atributo “DirectMethod” diz ao Ext.NET para criar um proxy entre o cliente e o servidor, automaticamente será criado um código javascript e o nosso método será exposto como um método  javascript.

note-taking Os métodos do tipo “DirectMethod“, diferentes dos tipos ASPX, não precisam ser estáticos, podem ser definidos como não-estáticos e no escopo do objeto.
Se definidos de forma estática, a vantagem é que o ciclo de vida da página ASP não ocorre, mas, em contrapartida, você não pode acessar os controles.

O namespace padrão criado para separar os “DirectMethods” no Ext.NET é o “App.direct“, neste namespace estão todos os “DirectMethods” criados para a requisição. Como pode ser visto na linha em destaque no código javascript.

Perceba que nos dois exemplos, temos a chamada pelo manipulador, “handler” e pela função “Fn“. Ambos já foram explicados no tópico “Utilizando Listeners (Eventos no lado cliente) e DirectEvents (Lado Servidor)“.

Retornando valores

Muitas vezes precisamos ir ao servidor e retornar algum resultado para o lado cliente, isso é possível, pois podemos ter retornos em nossos “DirectMethods“. Vamos aos exemplos:

Com um resultado simples

ASPX Code

<script type="text/javascript" src="../Scripts/DirectMethods.js"></script>
<ext:Button ID="Button3" runat="server" Text="Que horas são?" Icon="Clock">
	<Listeners>
		<Click Fn="MyApp.showTimeResult">
		</Click>
	</Listeners>
</ext:Button>

Code Behind

[DirectMethod]
public string ShowTimeResult()
{
	return "No servidor são exatamente " + DateTime.Now.ToLongTimeString();
}

javascript

MyApp.showTimeResult = function() {
    App.direct.ShowTimeResult({
        success : function(result) {
            Ext.Msg.show({
                title : 'Server Time',
                msg : result,
                buttons : Ext.Msg.OK,
                icon : Ext.Msg.WARNING
            });
        }
    });
};

O retorno não se restringe à apenas os tipos primários, podemos ter o nosso próprio tipo para retornar. Veja o exemplo:

Com um tipo definido

Definindo o nosso tipo

public struct MyInfo
{
	public string Nome { get; set; }
	public string Email { get; set; }
}

ASPX Code

<script type="text/javascript" src="../Scripts/DirectMethods.js"></script>
<ext:Button ID="Button4" runat="server" Text="Quem é você?" Icon="Information">
	<Listeners>
		<Click Fn="MyApp.getInfo">
		</Click>
	</Listeners>
</ext:Button>

Code Behind

[DirectMethod]
public MyInfo GetInfo()
{
	return new MyInfo {
		Nome = "http://desenvolvedores.net",
		Email="aha@evitandospam.com :)"
	};
}

javascript

MyApp.getInfo = function() {
    App.direct.GetInfo({
        success : function(result) {
            var msg = 'Eu sou o site ' + result.Nome + ' e meu e-mail é ' + result.Email;

            Ext.Msg.show({
                title : 'Info',
                msg : msg,
                buttons : Ext.Msg.OK,
                icon : Ext.Msg.INFO
            });
        }
    });
};

DirectMethods com parâmetros

Tipos primitivos

Podemos passar parâmetros para os nossos “DirectMethods“. No exemplo abaixo, eu vou utilizar um parâmetro do tipo data, calcular a idade e retornar a idade que deverá ser exibida ao utilizador da aplicação.

ASPX Code

<ext:DateField ID="DateField1" runat="server" FieldLabel="Data de Nascimento">
</ext:DateField>
<script type="text/javascript" src="../Scripts/DirectMethods.js"></script>
<ext:Button ID="Button5" runat="server" Text="Qual a sua idade?" Icon="Information">
	<Listeners>
		<Click Handler="MyApp.getAge(#{DateField1}.value);">
		</Click>
	</Listeners>
</ext:Button>
note-taking Atenção à linha em destaque, como utilizamos a passagem de parâmetro direto pelo evento, temos que definir a chamada como um “handler” , pois caso contrário o nosso método será chamado durante o carregamento da página. E não queremos isso. 🙂

Code Behind

[DirectMethod]
public int GetAge(DateTime dob)
{
	int age = DateTime.Now.Year - dob.Year;
	if(DateTime.Now.Month < dob.Month ||
		(DateTime.Now.Month == dob.Month &&
		DateTime.Now.Day < dob.Day))
		age--;

	return age;
}

javascript

MyApp.getAge = function(dob) {
    App.direct.GetAge(dob, {
        success : function(result) {
            var msg = 'Olá! Você tem ' + result + ' anos.';

            Ext.Msg.show({
                title : 'Age',
                msg : msg,
                buttons : Ext.Msg.OK,
                icon : Ext.Msg.INFO
            });
        }
    });
};

Parâmetros com tipos definidos

Se existir a necessidade de se passar um tipo definido como parâmetro, isso também é possível. Veja o exemplo:

ASPX Code

<ext:TextField ID="TextField1" runat="server" FieldLabel="Informe seu nome">
</ext:TextField>
<ext:TextField ID="TextField2" runat="server" FieldLabel="Informe seu email">
</ext:TextField>
<ext:Button ID="Button6" runat="server" Icon="Accept" Text="Enviar">
	<Listeners>
		<Click Handler="MyApp.showInfo(#{TextField1}.value, #{TextField2}.value);">
		</Click>
	</Listeners>
</ext:Button>

Code Behind

[DirectMethod]
public string ShowInfo(MyInfo info)
{
	return String.Format("Olá {0}! Seu e-mail é {1}.", info.Nome, info.Email);
}

javascript

MyApp.showInfo = function(nome, email) {
    /*
     * Devemos criar aqui o nosso objeto que será passado como parâmetro.
     * Temos que respoeitar exatamente a definição de nome que demos à nossas
     * propriedades.
     * Os nomes das propriedades do objeto criado não são sensíveis ao caso.
     */
    var myinfo = {
        nome : nome,
        email : email
    };

    App.direct.ShowInfo(myinfo, {
        success : function(result) {
            Ext.Msg.show({
                title : 'Info',
                msg : result,
                buttons : Ext.Msg.OK,
                icon : Ext.Msg.INFO
            });
        }
    });
};

Tratando exceções

Como nossos sitema não é a prova de falhas, temos que tratar as exceções que podem ocorrer no processamento de uma requisição ao servidor.
Nos exemplos abaixo, iremos ver as exceções tratadas e as não tratadas.

Uma exceção tratada

ASPX Code

<ext:Button ID="Button7" runat="server" Icon="Error" Text="Erro :(">
	<Listeners>
		<Click Fn="MyApp.catchException">
		</Click>
	</Listeners>
</ext:Button>

Code Behind

[DirectMethod]
public void CatchException()
{
	try
	{
		throw new Exception("Ops! Um erro foi lançado.");
	}
	catch(Exception ex)
	{
		Ext.Net.ResourceManager.AjaxSuccess = false;
		Ext.Net.ResourceManager.AjaxErrorMessage = ex.Message;
	}
}
note-taking As duas linhas em destaque indicam que o retorno deverá acontecer como uma falha, logo devemos dizer ao Ext.NET que houve um erro na requisição. Para isso passamos a propriedade “Ext.Net.ResourceManager.AjaxSuccess” para false e a propriedade “Ext.Net.ResourceManager.AjaxErrorMessage” irá receber a mensagem de erro que será exibida ao utilizador da aplicação.

javascript

MyApp.catchException = function() {
    App.direct.CatchException({
        failure : function(result) {
            Ext.Msg.alert('Erro!', result);
        }
    });
};
note-taking Neste ponto, temos que tratar um método diferente,no caso o método “failure‘ que será chamado sempre que ocorrer um erro no lado servidor, ou sempre que a propriedade “Ext.Net.ResourceManager.AjaxSuccess” retornar “false“.

Uma exceção não tratada

ASPX Code

<ext:Button ID="Button8" runat="server" Icon="Error" Text="Erro não tratado :(">
	<Listeners>
		<Click Fn="MyApp.unhandledException">
		</Click>
	</Listeners>
</ext:Button>

Code Behind

[DirectMethod]
public void UnhandledException()
{
	throw new Exception("Ops! Um erro não tratado foi lançado.");
}

javascript

MyApp.unhandledException = function() {
App.direct.UnhandledException({
	failure : function(result) {
		Ext.Msg.alert('Erro!', result);
	}
});
}; 

Uma exceção não tratada e sem “failure”

<ext:Button ID="Button9" runat="server" Icon="Error" Text="Erro não tratado e sem failure :(">
	<Listeners>
		<Click Handler="App.direct.UnhandledException();">
		</Click>
	</Listeners>
</ext:Button>

Como podemos perceber, é sempre bom termos o hábito de tratar a falha em uma requisição “DirectMethod“, nunca sabemos se ela irá acontecer ou não devido aos diversos fatores quando desenvolvemos para web.

Se o método “failure” não for especificado, uma caixa de mensagem semelhante à esta será exibida.

request_failure

Mais sobre “DirectMethods”

Como vimos, o namespace padrão definido pelo Ext.NET é o “App.direct”, mas, podemos decidir que queremos utilizar o nosso próprio namespace, para isso temos que modificar a definição do nosso atributo “[DirectMethod]“, vejamos algumas propriedades do mesmo.

Definindo um namespace (CompanyX)

ASPX Code

<ext:Button ID="Button10" runat="server" Icon="ApplicationGo" Text="Namespace Defin">
	<Listeners>
		<Click Fn="MyApp.definedNamespace">
		</Click>
	</Listeners>
</ext:Button>

Code Behind

[DirectMethod(Namespace = "CompanyX")]
public void DefinedNamespace()
{
	X.MessageBox.Show(new MessageBoxConfig
	{
		Buttons = MessageBox.Button.OK,
		Title = "Olá!",
		Message = "Eu fui chamado de um namespace definido por você. :)",
		Icon = MessageBox.Icon.INFO
	});
}
note-taking Perceba que na linha em destaque, nós adicionamos o namespace que queremos para a nossa aplicação, neste caso “CompanyX

javascript

MyApp.definedNamespace = function() {
    CompanyX.DefinedNamespace();
};
question Isto é útil quando temos uma aplicação muito grande, e queremos definir o nosso próprio namespace.
Mas, eu tenho que ficar a todo momento definindo o namespace para um “DirectMethod“?

R: Não.
Você não precisa a todo momento ficar escrevendo o namespace padrão.
Dentro do web.config, nas configurações do ext.net você pode adicionar a seguinte propriedade

<extnet directMethodNamespace="CompanyX"/>

e voilà todos os seus “DirectMethods” estarão utilizando o namespace padrão “CompanyX“.

 

note-taking Mas tome o cuidado de corrigir todos os pontos que você usou o namespace antigo “App.direct“, pois eles deixarão de funcionar.

Para saber mais sobre “DirectMethods” veja os exemplo em http://examples.ext.net/#/Events/DirectMethods/Overview/


É 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

Listeners_Eventos

Para um melhor entendimento deste Artigo veja o Índice (Rich Internet Applications com Ext.Net)

Listeners – Eventos lado cliente

Para facilitar o entendimento do artigo, vamos primeiro definir o que são listeners e eventos.

Listeners

Listeners são objetos ouvintes que notificam outros objetos quando acontece alguma mudança no comportamento do objeto. Os listeners utilizam o Design Pattern Observer.

Eventos

Os eventos são os tipos mais comuns que utilizam um listener, pois são neles que definimos quais métodos  serão chamados (Alguém disse delegates?) quando uma ação ocorrer.

Eventos são lançados sempre que uma ação acontece no nosso objeto, seja motivada pelo usuário, pelo próprio sistema ou por mensagens do sistema operacional.

Eventos no Ext.NET

O Ext.NET suporta eventos do lado cliente, AJAX e as formas tradicionais de tratamento de eventos.
Cada componente tem seus eventos, lado cliente, definidos dentro da tag “listeners“.

Como exemplo, vamos pegar um simples clique de botão e exibir uma mensagem.

<body>
    <ext:ResourceManager ID="ResourceManager1" runat="server">
    </ext:ResourceManager>
    <form id="form1" runat="server">
    <ext:Button ID="Button1" runat="server" Icon="Accept" Text="Clica em mim.">
        <Listeners>
            <Click Handler="Ext.Msg.show({
                                                   title: 'Oi!',
                                                   msg: 'Oba! Fui clicado.',
                                                   buttons: Ext.Msg.OK,
                                                   icon: Ext.Msg.WARNING
                                               });">
            </Click>
        </Listeners>
    </ext:Button>
    </form>
</body>

Neste pequeno trecho de código podemos dizer que tratamos o evento clique de um botão qualquer.

Uma outra forma de tratarmos o evento, seria criando uma função em javascript.

note-taking Eu, particularmente, prefiro esta segunda abordagem, pois assim deixo todos os meus fontes separados entre as classes (.cs), o código html (.aspx) e o código de script (.js).

Para este exemplo, crie um arquivo com o nome de “MyApp.js” no seu projeto e cole o código abaixo:

/**
 Arquivo de definição dos objetos em javascript
 */

// definir o namespace de base para a aplicação
var MyApp = {};

/**
 Define o método listener para o clique do botão
 */
MyApp.Button1Click = function() {
    Ext.Msg.show({
        title : 'Oi!',
        msg : 'Oba! Fui clicado em uma função.',
        buttons : Ext.Msg.OK,
        icon : Ext.Msg.WARNING
    });
};

Agora para a chamada do método clique, iremos definir um ponteiro para uma função em javascript.

<ext:Button ID="Button2" runat="server" Icon="Accept" Text="Clica em mim.">
        <Listeners>
            <Click Fn="MyApp.Button1Click">
            </Click>
        </Listeners>
</ext:Button>

Neste ponto podemos perceber que temos dois meios de chamar um método para o evento “Click“, no primeiro utilizamos um manipulador (handler) diretamente na definição do evento. E no segundo método, definimos um ponteiro (pointer) para uma função definida em nosso arquivo de script.

Esta é a diferença entre usar “Handler” e “Fn“.

Se o evento só deve ser executado uma única vez, podemos definir a propriedade “Single” para “true” e o evento só será executado uma vez, até que a página seja recarregada.

Se for necessário definir o escopo em que o evento deverá ser executado, devemos utilizar a propriedade “scope” e passar o nome do objeto contêiner onde o evento será executado. Se nada for informado, será utilizado o escopo global.

Determinando os argumentos do evento

Usando a documentação do Ext JS você poderá encontrar os argumentos que são passados para cada evento. Tenha em mente que diferentes controles têm diferentes eventos e assinaturas de evento.

Para uma documentação completa do lado cliente veja o link http://docs-origin.sencha.com/extjs/4.1.3.

DirectEvents (Eventos do Lado Servidor)

Os “DirectEvents” são eventos que são lançados pelo lado cliente e que podem ser capturados pelo lado servidor.

Tenha em mente que quando um “DirectEvent” é lançado, todo o controle deverá ser reconstruído do lado servidor, como é feito em um post tradicional. Se o seu form tem o atributo “runat=’server’” todo o formulário será reenviado por padrão.

Isto pode nos causar alguns problemas e para validar se devemos recriar e evitar vários códigos de inicialização da nossa página, podemos usar a propriedade “X.IsAjaxRequest”,  se true, a requisição veio de um evento AJAX.  Esta propriedade funciona como a propriedade do ASP.NET “IsPostBack“.

Vamos ver 3 exemplos de chamadas “DirectEvents” que são usados com muito frequência.

Sem parâmetros

ASPX Code

<ext:Button ID="Button1" runat="server" Icon="Clock" Text="Que horas são?"><DirectEvents>
            <Click OnEvent="Button1Click">
            </Click>
        </DirectEvents>
    </ext:Button>

Code Behind

protected void Button1Click(object sender, DirectEventArgs e)
        {
            X.Msg.Show(new MessageBoxConfig
            {
                Buttons = MessageBox.Button.OK,
                Title = "Olá!",
                Message = String.Format("São {0}.", DateTime.Now.ToLongTimeString())
            });
        }

Com parâmetros

Para definir parâmetros, temos que utilizar a marcação “ExtraParams” que possuem 3 propriedades importantes:

  1. Mode:
    1. Pode ser “Raw“: Define que o conteúdo da propriedade  “Value” deverá ser executado antes de ser enviado ao servidor;
    2. Poder ser “Value“: Define que o conteúdo da propriedade “Value” deverá ser retornado como especificado;
  2. Name: Nome do parâmetro que será enviado ao servidor, pode ser passado mais de um item de parâmetro, este nome será o índice que iremos recuperar o valor do parâmetro no servidor;
  3. Value:  Valor que deverá ser passado ao servidor, atente para o item 1. Mode, que define como este valor deverá ser interpretado;

ASPX Code

<ext:TextField ID="TextField1" runat="server" FieldLabel="Informe seu nome.">
    </ext:TextField>
    <ext:Button ID="Button2" runat="server" Icon="Clock" Text="Que horas são?">
        <DirectEvents>
            <Click OnEvent="Button2Click">
                <ExtraParams>
                    <ext:Parameter Mode="Raw" Value="#{TextField1}.value" Name="nome">
                    </ext:Parameter>
                </ExtraParams>
            </Click>
        </DirectEvents>
    </ext:Button>

Code Behind

protected void Button2Click(object sender, DirectEventArgs e)
        {
            //Perceba que pegamos aqui pelo nome do extra params que informamos no ASPX Code
            string nome = e.ExtraParams["nome"];

            X.Msg.Show(new MessageBoxConfig
            {
                Buttons = MessageBox.Button.OK,
                Title = String.Format("Olá {0}!", nome),
                Message = String.Format("São {0}.", DateTime.Now.ToLongTimeString())
            });
        }

Com parâmetros de um objeto definido

Com esta opção, podemos criar um objeto do lado cliente e passar este objeto para o lado servidor.
Do lado servidor o mesmo deverá ser recriado para um objeto compreendido pelo C#.

Para este exemplo, iremos criar um arquivo de javascript com o nome de  DirectEvent.js com o seguinte código:

/**
 Arquivo de definição dos objetos em javascript
 */

// definir o namespace de base para a aplicação
var MyApp = {};

/**
 Define o método listener para o clique do botão
 */
MyApp.Button3Click = function() {
    //Aqui iremos criar um objeto do tipo 'MyInfo', esperado pelo lado servidor
    var result = {
        Nome : Ext.getCmp('TextField2').value,
        Email : Ext.getCmp('TextField3').value
    };

    return result;
};

ASPX Code

<script type="text/javascript" src="../Scripts/DirectEvent.js"> </script>
    <ext:TextField ID="TextField2" runat="server" FieldLabel="Informe seu nome">
    </ext:TextField>
    <ext:TextField ID="TextField3" runat="server" FieldLabel="Informe seu email">
    </ext:TextField>
    <ext:Button ID="Button3" runat="server" Icon="Clock" Text="Enviar">
        <DirectEvents>
            <Click OnEvent="Button3Click">
                <ExtraParams>
                    <ext:Parameter Mode="Raw" Value="MyApp.Button3Click()" Name="dados">
                    </ext:Parameter>
                </ExtraParams>
            </Click>
        </DirectEvents>
    </ext:Button>

Code Behind

Definição do objeto que o lado cliente deverá retornar

/// <summary>
/// Objeto retornado pelo cliente
/// </summary>
struct MeusDados
{
    public string Nome { get; set; }
    public string Email { get; set; }
}

Método que irá receber a informação do lado cliente e converter para o objeto esperado

protected void Button3Click(object sender, DirectEventArgs e)
{
    // Aqui iremos converter o objeto que recebemos do lado cliente
   // em um objeto do tipo "MyInfo"
    MyInfo dados = JSON.Deserialize<MyInfo>(e.ExtraParams["dados"]);
    X.Msg.Show(new MessageBoxConfig
    {
        Buttons = MessageBox.Button.OK,
        Title = String.Format("Olá {0}!", dados.Nome),
        Message = String.Format("Seu e-mail é  {0}.", dados.Email)
    });
}

Neste tópico não iremos abordar como criar  o nosso próprio manipulador de eventos. Este será abordado no tópico “Criando componentes no lado Servidor


É 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

SharpSVN

1
1 Estrela2 Estrelas3 Estrelas4 Estrelas5 Estrelas (3 votos, média: 5,00 de 5)
Loading...
17 de julho de 2011

Eu sempre usei o Subversion pra controlar as versões de meus códigos e no começo deste mês tive a necessidade de desenvolver uma aplicação que recuperasse as revisões do SVN e disponibilizasse em um site para controle dos gerentes de um dos projetos.

Como ferramenta eu optei por usar o SharpSVN, uma biblioteca escrita  para .NET. Apesar do esforço não encontrei muita coisa em português então resolvi dar uma estudada na documentação (http://docs.sharpsvn.net/current) e escrever este artigo.

Aqui eu vou mostrar uma conexão simples e como resolver o seguinte erro ao publicar o site  “SharpSvn.SvnFormatException: Can’t determine the user’s config path“.

Então vamos lá. Mãos a obra.

Primeiramente temos que preparar o nosso ambiente, para isso temos que baixar os arquivos do SharpSVN http://sharpsvn.open.collab.net/files/documents/180/4381/SSvn-1.6016.1637.zip

Extraia os arquivos.

Abra o Visual Studio e cria uma nova aplicação Web.

Faça referência a dll SharpSvn.dll.

Eu vou recuperar as versões de um projeto que nós do desenvolvedores.net apoiamos e que está no Sourceforge

Página oficial do projeto: http://uninfe.com.br

Página no Sourceforge: https://uninfe.svn.sourceforge.net/svnroot/uninfe

E como sempre, prestem atenção aos comentários do código. Eu coloco informações úteis no mesmo.

<%@ Page Language="C#" AutoEventWireup="true" %>

<!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>Exemplo SVN</title>

    <script runat="server" type="text/C#">
        protected void Page_Load(object sender, EventArgs e)
        {
            //definir o datasource do meu grid
            grdRevision.DataSource = LoadSvnRevision();

            //popular os dados no grid
            grdRevision.DataBind();
        }

        private System.Collections.Generic.List<object> LoadSvnRevision()
        {
            //inicar o cliente svm
            SharpSvn.SvnClient client = new SharpSvn.SvnClient();
            //aqui iniciamos o objeto que irá receber os dados de retorno do svn.
            //Obrigatoriamente tem que ser deste tipo System.Collections.ObjectModel.Collection<SharpSvn.SvnLogEventArgs>
            //pois o parâmetro é do tipo "out"
            System.Collections.ObjectModel.Collection<SharpSvn.SvnLogEventArgs> logItems = new System.Collections.ObjectModel.Collection<SharpSvn.SvnLogEventArgs>();

            //aqui chamamos o método responsável por trazer as revisões do SVN
            //no primeiro parâmetro informamos a url do repositório. (targetPath)
            //no segundo parâmetro informamos a nossa variável que irá receber o retorno
            client.GetLog(new Uri("https://uninfe.svn.sourceforge.net/svnroot/uninfe"), out logItems);

            //aqui eu crio uma variável que irá recuperar este retorno e converter
            //em uma lista de obejtos para ser usada dentro do meu grid
            System.Collections.Generic.List<object> data = new System.Collections.Generic.List<object>();

            foreach (var item in logItems) //aqui eu uso um array nomeado do tipo Key/Value
            {
                data.Add(new
                {
                    Id = item.Revision,
                    Autor = item.Author,
                    Data = item.Time,
                });
            }

            //descarrego cliente
            client.Dispose();

            //limpo da memória
            client = null;

            //retorno minha lista de dados
            return data;
        }
    </script>

</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:GridView runat="server" ID="grdRevision">
        </asp:GridView>
    </div>
    </form>
</body>
</html>

Assim temos uma aplicação básica que recupera os dados de um diretório publico. Mas, e se for em um diretório privado?

Basta acrescentar estas duas linhas ao seu código. Antes de chamar o método client.GetLog();

//Limpamos a autenticação antes de começar
client.Authentication.Clear();
//criamos uma autenticação de usuário usando o System.Net.NetworkCredential
client.Authentication.DefaultCredentials = new System.Net.NetworkCredential("Nome do usuário", "senha");

Uma outra dica que creio ser interessante passar é a opção de filtragem dos dados que iremos receber em nosso objeto de retorno. Do modo como foi feito no código de exemplo iremos recuperar todas as revisões, isso não é interessante em um projeto grande. Aqui vou ensinar a fazer o filtro por data.

//data de início do log que vamos buscar
//aqui informo +1 dia para que pegue também o dia atual
DateTime startDateTime = DateTime.Today.AddDays(1);

//iremos buscar 15 dias antes. Então informamos a segunda data
DateTime endDateTime = startDateTime.AddDays(-15);

//aqui iremos criar um "range" de datas para filtrar.
//para isso usamos o tipo SharpSvn.SvnRevisionRange
//o construtor do range aceita o tipo new SharpSvn.SvnRevision
//que por sua vez aceita vários tipos de filtros, um deles é o tipo data
//passamos então as datas de início e fim do range,
//de acordo com os parâmetros do contrutor do objeto SharpSvn.SvnRevisionRange
//primeiro e segundo parâmetro do construtor
SharpSvn.SvnRevisionRange range = new SharpSvn.SvnRevisionRange(new SharpSvn.SvnRevision(startDateTime), new SharpSvn.SvnRevision(endDateTime));

//criamos a nossa variável do tipo SharpSvn.SvnLogArgs para passar o nosso range de datas.
SharpSvn.SvnLogArgs args = new SharpSvn.SvnLogArgs(range);

//aqui chamamos o método responsável por trazer as revisões do SVN
//no primeiro parâmetro informamos a url do repositório. (targetPath)
//no segundo parâmetro passamos os argumentos de filtragem dos dados
//no terceiro parâmetro informamos a nossa variável que irá receber o retorno
client.GetLog(new Uri("https://uninfe.svn.sourceforge.net/svnroot/uninfe"), args, out logItems);

Preste atenção na linha em destaque, repare que modificamos o método client.GetLog() e passamos o parâmetro args que é o nosso filtro por data.

Vamos agora à um problema conhecido quando publicamos o nosso site.  “SharpSvn.SvnFormatException: Can’t determine the user’s config path“. Este erro não acontece no modo debug porque estamos executando nossa aplicação local e a nossa configuração de usuário já foi toda carregada. Mas quando publicamos podemos receber este erro, pois normalmente a aplicação web roda como um serviço no servidor e pode não ter toda a configuração de usuário carregada. Para isso temos que informar o caminho onde iremos salvar a configuração padrão do usuário. Podemos usar um caminho temporário ou um caminho fixo na sua aplicação. Fica a seu critério. Eu optei por executar eu um caminho temporário.

Para contornar este erro, iremos usar o método LoadConfiguration() que irá indicar onde iremos salvar o arquivo de configuração temporário.

client.LoadConfiguration(System.IO.Path.Combine(System.IO.Path.GetTempPath(), "Svn"), true);

Atenção: Este método deve ser chamado antes de client.GetLog();

Abaixo o código completo de nossa aplicação SVN

<%@ Page Language="C#" AutoEventWireup="true" %>

<!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>Exemplo SVN</title>

    <script runat="server" type="text/C#">
        protected void Page_Load(object sender, EventArgs e)
        {
            //definir o datasource do meu grid
            grdRevision.DataSource = LoadSvnRevision();

            //popular os dados no grid
            grdRevision.DataBind();
        }

        private System.Collections.Generic.List<object> LoadSvnRevision()
        {
            //inicar o cliente svm
            SharpSvn.SvnClient client = new SharpSvn.SvnClient();
            //aqui iniciamos o objeto que irá receber os dados de retorno do svn.
            //Obrigatoriamente tem que ser deste tipo System.Collections.ObjectModel.Collection<SharpSvn.SvnLogEventArgs>
            //pois o parâmetro é do tipo "out"
            System.Collections.ObjectModel.Collection<SharpSvn.SvnLogEventArgs> logItems = new System.Collections.ObjectModel.Collection<SharpSvn.SvnLogEventArgs>();

            //data de início do log que vamos buscar
            DateTime startDateTime = DateTime.Today.AddDays(1);

            //iremos buscar 15 dias antes. Então informamos a segunda data
            DateTime endDateTime = startDateTime.AddDays(-15);

            //aqui iremos criar um "range" de datas para filtrar.
            //para isso usamos o tipo SharpSvn.SvnRevisionRange
            //o construtor do range aceita o tipo new SharpSvn.SvnRevision que por sua vez aceita vários tipos de filtros, um deles é o tipo data
            //passamos então as datas de início e fim do range, de acordo com os parâmetros do contrutor do objeto SharpSvn.SvnRevisionRange
            SharpSvn.SvnRevisionRange range = new SharpSvn.SvnRevisionRange(new SharpSvn.SvnRevision(startDateTime), new SharpSvn.SvnRevision(endDateTime));

            //criamos a nossa variável do tipo SharpSvn.SvnLogArgs para passar o nosso range de datas.
            SharpSvn.SvnLogArgs args = new SharpSvn.SvnLogArgs(range);

            //aqui iremos dizer onde o arquivo de configuração do svn deverá ser salvo
            client.LoadConfiguration(System.IO.Path.Combine(System.IO.Path.GetTempPath(), "Svn"), true);

            //aqui chamamos o método responsável por trazer as revisões do SVN
            //no primeiro parâmetro informamos a url do repositório. (targetPath)
            //no segundo parâmetro passamos os argumentos de filtragem dos dados
            //no terceiro parâmetro informamos a nossa variável que irá receber o retorno
            client.GetLog(new Uri("https://uninfe.svn.sourceforge.net/svnroot/uninfe"), args, out logItems);

            //aqui eu crio uma variável que irá recuperar este retorno e converter
            //em uma lista de obejtos para ser usada dentro do meu grid
            System.Collections.Generic.List<object> data = new System.Collections.Generic.List<object>();

            foreach (var item in logItems) //aqui eu uso um array nomeado do tipo Key/Value
            {
                data.Add(new
                {
                    Id = item.Revision,
                    Autor = item.Author,
                    Data = item.Time,
                });
            }

            //descarrego cliente
            client.Dispose();

            //limpo da memória
            client = null;

            //retorno minha lista de dados
            return data;
        }
    </script>

</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:GridView runat="server" ID="grdRevision">
        </asp:GridView>
    </div>
    </form>
</body>
</html>

É 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

1
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:
InputBox em C# (145)

É 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:
Paginação remota com Ext.net, handlers, aspx e C# (303)

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