You are browsing the archive for c#.

Capturar pontos no mapa com C# e Google Maps

19/07/2010 in Hacks, Tips and Tricks

Vocês devem ter reparado que a muito tempo não ando escrevendo nada técnico. Andei pensando em fazer uma reformulação no blog, e dedicar uma sessão exclusiva a pequenos trechos de códigos. Mas acabei não dando prioridade a essa mudança, então aqui estou eu novamente.

Durante os últimos meses recebi alguns e-mails falando do artigo sobre como construir mapas com .NET e Google Maps. Alguns eram pedindo dicas, outros pediam ajuda com implementação mais complexas. Então recentemente recebi um comentário sobre uma funcionalidade que já havia implementado a muito tempo. Então estou aqui para compartilhar o trecho de código.

A duvida em questão é, como capturar pontos clicados no google maps. Na verdade, é bem simples, mas antes você precisa entender como funciona a construir mapas utilizando google maps e a biblioteca Artem, para .NET e C#. Para saber o básico, clique aqui.

O funcionamento é simples e será explicado em alguns passos.

  1. Crie um textbox chamado txtLatitude e outro chamado txtLongitude
  2. Adicione o controle do Google Maps a pagina, com a propriedade de OnClientClick, apontando para a função javascript

    <artem:GoogleMap ID=”GMaps” runat=”server” OnClientClick=”__showInfo” ></artem:GoogleMap>

  3. Adicione a função javascript que irá capturar os valores do ponto clicado e preencher os textboxes
    <script type=”text/javascript”>
    function __showInfo(overlay, point) {
    if (point) {
    var infoLatitude = document.getElementById(‘<%= txtLatitude.ClientID %>’);
    infoLatitude.value = point.lat();
    var infoLongitude = document.getElementById(‘<%= txtLongitude.ClientID %>’);
    infoLongitude.value = point.lng();
    }
    }
    </script>

Pronto! Agora com esse código você já pode clicar no mapa e observar os valores sendo refletidos nas suas caixas de texto. O código javascript é bem simples e auto explicativo, então acho que não tem segredo. Qualquer dúvida, basta deixar um comentário.

Google Maps e ASP.NET – Marcando pontos no mapa

12/11/2009 in Hacks, Tips and Tricks

Algum tempo atrás, ensinei como construir mapas no ASP.NET usando o Google Maps. Agora vou ensinar como fazer com que sua aplicação saiba qual foi o ponto do mapa clicado pelo usuário.

Na verdade isso é bem simples de ser feito. E pode servir perfeitamente para sua aplicação, caso o usuário tenha que interagir com a aplicação para cadastrar uma nova localidade por exemplo.

Vamos levar em conta o seguinte cenário: Um usuário vai selecionar um ponto no mapa e os valores de latitude e longitude desse ponto, irão automaticamente preencher as caixas de texto com as respectivas informações.

Supondo que tenhamos 2 textboxs com os nomes, txtLatitude e txtLongitude como no código abaixo.

<asp:TextBox ID=”txtLatitude” runat=”server”></asp:TextBox>

<asp:TextBox ID=”txtLongitude” runat=”server”></asp:TextBox>

Se você já leu o artigo anterior que ensina como construir o mapa, sabe que teremos um um controle do Google Maps mais ou menos assim:

<artem:GoogleMap ID=”GMaps” runat=”server” OnClientClick=”__showInfo” ></artem:GoogleMap>

A diferença entre esse controle e o que foi falado no artigo anterior, é o evento de OnClientClick. Fazendo isso, estamos dizendo que um javascript chamado “__showInfo()” será executado quando ocorrer algum click por parte do usuário.

Agora, tudo que você precisa é adicionar esse script a sua pagina.

<script type=”text/javascript”>
function __showInfo(overlay, point) {
if (point) {
var infoLatitude = document.getElementById(‘<%= txtLatitude.ClientID %>’);
infoLatitude.value = point.lat();
var infoLongitude = document.getElementById(‘<%= txtLongitude.ClientID %>’);
infoLongitude.value = point.lng();
}
}
</script>

Nesse script, estamos capturando os valores da latitude e longitude  clicados no mapa e atribuindo aos textboxs.

A sintaxe do código abaixo pode parecer estranha para alguns, mas em tempo de execução o ASP.NET irá substituir o valor “<%= txtLatitude.ClientID %>” pelo ID da caixa de texto de latitude.

document.getElementById(‘<%= txtLatitude.ClientID %>’)

Acho que agora você já é capaz de montar sua própria pagina de cadastro de localidades usando o google maps. Qualquer duvida, basta deixar um comentário ou enviar um e-mail.

Usando captcha no ASP.NET

05/11/2009 in Hacks, Tips and Tricks

Se você está procurando uma alternativa de captcha para usar nas suas paginas asp.net, pode ficar despreocupado. O reCaptcha vai cuidar de toda a implementação do captcha para você.

Para usar é muito simples.  Vamos seguir passo a passo.

1- Baixe o plugin do reCaptcha para .NET aqui.

Lembrando que você terá que se cadastrar na pagina pois precisará de uma chave para utilizar o serviço. E essa chave é gerada durante o seu cadastro e o cadastro do domínio que irá usar o captcha na pagina do próprio serviço.

2- Adicione a dll que você baixou como referencia no seu projeto web

3- Registre o controle do captcha na pagina em que ele será usado.

<%@ Register TagPrefix=”recaptcha” Namespace=”Recaptcha” Assembly=”Recaptcha” %>

4-Adicione o código do controle captcha no seu webform

<recaptcha:RecaptchaControl
ID=”recaptcha”
runat=”server”
PublicKey=”"
PrivateKey=”"
/>

Os atributos de PublicKey e PrivateKey são as chaves que você recebe ao se cadastrar no serviço do recaptcha no site deles.

5- Codificar a validação do reCaptcha

Na verdade você não tem que codificar a validação do reCaptcha, é apenas uma linha de código para saber se o usuário digitou o valor certo ou não no captcha. Supondo que na sua pagina, você tem um botão chamado btnOK que dispara um evento de click onde é necessário saber se o usuario passou pela validação do captcha ou não para fazer o redirecionamento para a próxima pagina. Em um cenário como esse, o código seria algo assim:

protected void btnOK_Click(object sender, EventArgs e)
{
if (Page.IsValid)
{
Response.Redirect(“Default.aspx”);
}
}

O único trabalho que precisa existir é verificar se a pagina é valida, através do atributo da pagina, IsValid. Uma implementação simples e rápida. Você ainda pode customizar a aparencia do controle do reCaptcha. Mas essa explicação fica para um outro momento…

Espero ter ajudado.

Treinamento ASP.NET e Segurança em aplicações na UniJorge

28/10/2009 in Inteligência Digital

De 28 a 30 de outubro, vai acontecer na UniJorge em Salvador – Bahia o 4º encontro interdisciplinar de cultura, tecnologias e educação. Estarei no evento junto com um parceiro de projetos, Ivan Clay. Nós iremos ministrar juntos o treinamento de ASP.NET e eu irei ministrar também um treinamento de “Vulnerabilidades em aplicações web 2.0, causadas pelas más praticas de programação”.

Sobre o evento:

O IV Encontro Interdisciplinar de Cultura e Educação – INTERCULTE, congresso institucional do Centro Universitário Jorge Amado – UNIJORGE tem como tema Culturas, Ciências e Tecnologias: novas configurações territoriais.

Com esse tema, buscamos pensar a comunidade através dos elementos de  ”[...] territorialidade, permanência, [e] ligação entre existência de formas próprias de comunicação. O sentimento de pertencimento, ou “pertença”, seria a noção de que o indivíduo é parte de todo, coopera para uma finalidade comum com os demais membros; a territorialidade, o lócus da comunidade; a permanência, condição essencial para o estabelecimento das relações sociais” (Palácios apud Recuero, s/d, p. 04).

O INTERCULTE tem como objetivo estimular a comunidade acadêmica na produção, socialização e divulgação de conhecimentos científicos no campo educacional, promovendo intercâmbios entre alunos e pesquisadores, entre instituições de ensino e outras parcerias da comunidade.

Este objetivo demarca algumas diferenças quando do fortalecimento da produção intelectual e do compromisso na formação de profissionais pesquisadores, como por exemplo: a) a mediação nos processos de ensinar, aprender e construir conhecimentos e; b) o sentimento de pertença (ou pertencimento?) quando se trata de uma comunidade científica e acadêmica.

O evento é pago e vocês podem ter mais informações clicando aqui

Agurado vocês por lá.

PS: Para quem vai participar dos cursos, existe um formulário de satisfação sobre o curso, disponível aqui

Thread Lock – Trancando recursos para execução de threads usando Lock com C# e .NET

16/10/2009 in Geek Talk

As vezes é necessário que suas Threads acessem os mesmos objetos e modifiquem valores nesses objetos.
Porém se você estiver trabalhando com um computador multi-processado, por vezes os resultados serão errados, pois uma thread vai desfazer o que a outra já fez.

Vou explicar melhor essa historia.

Exemplo Clássico:
Temos um contador numa classe X

int contador = 0;

Só existe uma instância da classe X no seu programa, e toda vez que suas threads fizerem determinada atividade, elas deve incrementar em 1 esse contador.

Nada mais normal do que a classe X possuir um método assim:

public void AtualizaContador(){
contador++;
}

Para esse simples exemplo não estamos levando em conta as boas praticas e questões de encapsulamento que são muito importantes também.

Agora num ambiente multi-processado, imagine 2 Threads no mesmo momento tentando fazer a atualização do contador.

Supondo que nesse ponto o contador tenha o valor 10.
De maneira genérica, para fazer a atualização, os passos dados pelo processador seriam:

  1. Salvar o valor 10 no registrador do processador
  2. Incrementar o valor contido no registrador em 1
  3. retornar o valor para memória

Voltando ao exemplo…

Se duas Threads pegassem ao mesmo tempo o valor 10, as duas iam incrementar o valor para 11, porem na hora de salvar em memória, uma delas ia salvar primeiro o valor 11, por conseqüência a outra deveria salvar o valor 12 mas isso não acontece, ela salva o valor 11 novamente por cima do valor 11 que já estava lá. Causando uma inconsistência nos dados da nossa aplicação.

Temos diversas formas de tratar isso, principalmente porque “incrementação” é uma operação thread safe,então temos classes e métodos para tratar especificamente dessa situação.

Mas vamos tratar aqui como se fosse uma situação genérica. Dessa forma usaremos o lock do C#
De maneira muito simples de usar, o lock irá bloquear os recursos do objeto até que a thread que está utilizando o trecho do código acabe de processa-lo

Teríamos então o seguinte código:

public void AtualizaContador(){

lock(this){
contador++;
}
}

O lock recebe como parâmetro o this que é uma palavra reservada do C#, que referencia o objeto em questão. No caso, como o método está dentro da classe X, o this então, representa a classe X. É como se a própria classe estivesse se referenciando.

Espero ter conseguido passar um pouco da importância do lock.
Existem outras formas de fazer isso, mas teríamos que entrar em outras discussões como dead lock e etc… Então trarei isso em um outro post.
Talvez vocês não enxerguem a importância disso num exemplo simples como esse, mas em ambientes complexos isso toma proporções enormes.

Espero ter ajudado
Até a próxima.

FindControl no Repeater com C# e ASP.NET

16/10/2009 in Geek Talk

Hoje fui consultado sobre o método FindControl no Repeater do ASP.NET. Comecei então a pensar no tempo que iniciei o aprendizado em ASP.NET, e tive alguns problemas com o Repeater.

Esse controle é relativamente fácil de se entender, mas na minha opinião, o problema é que ele favorece a “gambiarra“. Ele permite que você insira muita lógica de programação, dentro do arquivo ASPX. Não querendo entrar no mérito de desenvolvimento em camadas, mas se a Microsoft propôs a divisão em um arquivo ASPX e outro do codebehind, é porque ela tinha em mente separar a apresentação do código.  Analisando isso, desde cedo me eduquei a trabalhar com repeater no codebehind e não no ASPX. E uma pergunta que me é feita frequentemente por quem está se acostumando com o desenvolvimento em .NET é: “Como posso manipular um controle que está dentro do repeater no codebehind?”

O caminho natural é programar dentro do evento ItemDataBound do repeater, algo como:

meuRepeater.FindControl(“nomeDoControle”);

Infelizmente, isso não vai te trazer o resultado esperado, pois o seu controle está dentro do ItemTemplate do repeater. O ItemTemplate vai virar um Array de Itens, criando um novo item para cada linha do datasource que você usou para preencher o repeater. Então o correto é tentar achar o controle no Item do repeater e não no repeater diretamente. A sintaxe ficaria algo como:

void meuRepeater_ItemDataBound(object sender, RepeaterItemEventArgs e)
{

if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{
Label lblDescricao = (Label) e.Item.FindControl(“lblDescricao”);
lblDescricao.Text = “Meu novo Texto”;
}

}

No Exemplo acima, utilizamos o RepeaterItemEventArgs que é passado como parametro ao Evento para obter acesso ao Item corrente e procurar nosso Label dentro dele.

E você, tem alguma duvida sobre .NET? Esse artigo não esclareceu sua duvida? Deixe seu comentário ou envie um e-mail que terei prazer em responder.

Construindo mapas com C# .NET e Google Maps

05/10/2009 in Geek Talk, Hacks, Tips and Tricks

Você quer fazer um mapa, utilizando a API do Google Maps, mas não quer ou não sabe usar javascript?

As vezes fazer as coisas em javascript se torna difícil. Nem todas as IDEs do mercado oferecem um ambiente de desenvolvimento para javascript amigável. Por isso procurei algumas soluções para fazer algumas brincadeirinhas com o Google Maps, sem precisar implementar nada em javascript.
Eu sou muito familiarizado com C#, por isso parti logo a procura de uma biblioteca .NET que pudesse atender as minhas necessidades.
Achei rapidamente um projeto no codeplex que oferecia exatamente o que eu procurava. Para quem tiver interesse e quiser contribuir com o projeto, segue o link: Google Maps
No site do projeto existem alguns exemplos de como usar o controle colocando o código na pagina ASPX. Mas como na maior parte das vezes, temos as coordenadas de latitude e longitude gravadas no banco, e a partir disso vamos montar o mapa, vou mostrar aqui um passo a passo rápido de como usar o controle.

Passo 1 – Fazer o download da biblioteca e adiciona-la ao projeto:
Depois de fazer o download da Biblioteca que irá fazer a interação com o Google Maps. No seu projeto adicione uma nova referência, clicando com o botão direito, selecionando “Add Reference” e em seguida indo na aba “Browse” e escolhendo o arquivo da biblioteca que você fez o download.

Passo 2 – Alterar o web.confg:
Vá ao web.config e procure a sessão
Você vai encontrar algo parecido com o que segue abaixo:

<pages>

<controls>

<add tagPrefix=”asp” namespace=”System.Web.UI” assembly=”System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35″/>

<add tagPrefix=”asp” namespace=”System.Web.UI.WebControls” assembly=”System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35″/>

</controls>

</pages>

Adicione então a tag responsavel pelo uso do novo controle em qualquer lugar entre as tags <control> e </control> . Existem outras formas de fazer isso, mas eu considero essa a mais rapida.
A tag é a seguinte:

<add tagPrefix=”artem” namespace=”Artem.Web.UI.Controls” assembly=”Artem.GoogleMap”/>

Passo 3 – Código na página ASPX:
Na sua página ASPX, onde deseja exibir o controle, basta colocar a tag responsável pelo controle. Aconselho colocá-la dentro de uma DIV para melhor controle. O controle dentro de uma DIV, fica assim:

<div>

<artem:GoogleMap ID=”mapa” runat=”server” ></artem:GoogleMap>

</div>

E no topo da pagina, é preciso registrar o controle, assim:
<%@ Register assembly=”Artem.GoogleMap” namespace=”Artem.Web.UI.Controls” tagprefix=”artem” %>

Passo 4 – Código no codebehind:
O codigo a seguir exemplifica a plotagem de um mapa, no tamanho 600×600, com centro na latitude -12.928192 e logintude -38.360996
E com um marcador plotado no mesmo ponto. O detalhe é que esse marcador é clicavel e o texto que ele irá exibir, é um texto qualquer que você pode setar usando tags HTML, inclusive imagens.

protected void Page_Load(object sender, EventArgs e)
{
double latitude = -12.928192;
double longitude = -38.360996;
mapa.Latitude = latitude;
mapa.Longitude = longitude;
mapa.Zoom = 15;
GoogleMarker marcador1 = new GoogleMarker(latitude, longitude);
marcador1.Text = “<h2>Texto</h2><br/>Aqui fica o texto de exemplo”;
marcador1.Clickable = true;
mapa.Markers.Add(marcador1);
mapa.Width = 600;
mapa.Height = 600;
mapa.Key = “SuaKeyDoGoogleMapsAPI”;
}

Exemplo de implementação do Google Maps utilizando C#

Exemplo de implementação do Google Maps utilizando C#

Pronto!
Em 4 passos você conseguiu montar um mapa em C#, utilizando o Google Maps e sem digitar uma linha de javascript.

Em breve irei disponibilizar para download um projeto com exemplo de utilização.

 

You need to log in to vote

The blog owner requires users to be logged in to be able to vote for this post.

Alternatively, if you do not have an account yet you can create one here.

Powered by Vote It Up