domingo, 19 de dezembro de 2010

Youtube API em ASP.NET

E aí, programadores! 

Dentre os grandes projetos hospedados no CodePlex (que é um repositório de códigos-fonte de projetos open source), podemos encontrar um que possibilite a visualização de vídeos do Youtube. Estamos falando sobre oYoutube API

O projeto está disponível no endereço http://youtube.codeplex.com/. Analisando o código fonte do projeto, se trata nada mais, nada menos que uma rotina implementada com o uso do Ajax (controles da aba Ajax Extensions daToolbox), além de uma classe (YouTubeScript.cs) que é responsável por renderizar o player embarcado doYoutube



Segue uma lista com alguns dos projetos de código aberto que estão disponíveis no CodePlex: 

Open NFe
RDI Open NFe é uma solução de código-fonte aberto desenvolvida pela Rocha Digital Intelligence (RDI) para a Administração de Notas Fiscais Eletrônicas dentro das empresas. A solução é parte do projeto RDI Open SPED.

Boleto.Net
http://boletonet.codeplex.com/
Boleto.Net é um componente desenvolvido em C# e ASP.Net e contempla as seguintes funcionalidades:
  • Emissão e Impressão de Boletos Bancários 
  • Geração de Arquivo de Remessa (CNAB 240 e 400) 
  • Leitura do Arquivo de Retorno (CNAB 240 e 400) 


LINQ2Twitter
http://linqtotwitter.codeplex.com/
LINQ to Twitter é um provedor LINQ para o serviço demicro-blogging Twitter. Ele usa a sintaxe LINQ para consultas e inclui chamadas de método para mudanças através da API do Twitter.

LinkedIn Developer Toolkit
O LinkedIn Developer Toolkit é uma biblioteca de código abertoconstruído em C # para usar o LinkedIn ® API em suas aplicaçõesweb.

O código fonte está disponível no link abaixo:
YoutubeAPI.rar

Por enquanto é só, até mais!

domingo, 12 de dezembro de 2010

Usando o CustomValidator

E aí, pessoal!

Dentre os controles de validação do Visual Studio, tem um deles que julgo ser muito útil, já que podemos customizar um validador utilizando uma rotina em linguagem JavaScript (ou linguagem C# e VB.Net com validação do lado do servidor). Estamos falando do CustomValidator.

Neste artigo, vamos utilizar um exemplo simples pra validar uma digitação numérica em um controle do tipoTextBox.

Crie um novo projeto no VS do tipo Web Site e linguagem C#.



Na aba Source da página Default.aspx, altere o código fonte conforme as linhas abaixo: 
<%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs"Inherits="_Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
    <script language="javascript">
        function validateNumber(oSrc, args) {
            var num = parseFloat(args.Value);
            if (isNaN(num))
                args.IsValid = false;
            else
                args.IsValid = (args.Value.length == 10);
        }
    </script>
</head>
<body style="font-familyTrebuchet MS;">
    <form id="form1" runat="server">
    <h1>Usando o CustomValidator</h1>
    <div>Digite um número</div>
        <asp:TextBox ID="TextBox1" runat="server" MaxLength="10"></asp:TextBox>
    <asp:CustomValidator ID="CustomValidator1"
            runat="server" ErrorMessage="Informe um número com 10 dígitos"
        ClientValidationFunction="validateNumber" ControlToValidate="TextBox1"
        SetFocusOnError="True" ValidateEmptyText="True"></asp:CustomValidator><br /><br />
    <asp:Button ID="Button1" runat="server" Text="Enviar" onclick="Button1_Click" />
    </form>
</body>
</html>

Perceba que criamos uma função em linguagem JavaScript com o nome de validateNumber. O objetivo dela é validar se a digitação é numérica além da quantidade de dígitos que foi digitado pelo usuário.

Clique no menu View > Code ou pressione a tecla F7 para acessarmos o editor de código em linguagem C#. Inicialmente, altere o evento Load da página conforme os linhas abaixo:
protected void Page_Load(object sender, EventArgs e)
{
        string script = "if (document.form1.TextBox1.value == '') {       document.form1.TextBox1.focus(); return false; }";
        Button1.Attributes.Add("onclick", script);
}

Dê um clique no botão Enviar, e acrescente as linhas de código a seguir:

protected void Button1_Click(object sender, EventArgs e)
{
        ScriptManager.RegisterStartupScript(thisthis.GetType(), "alerta","alert('Enviado com sucesso!');"true);
}
Se tudo correr bem, teste a aplicação e confira o resultado.


Por enquanto é só. Até mais!

domingo, 5 de dezembro de 2010

Cadastro de contatos pessoais - Parte 3

Requisitos:

Saudações, pessoal!

Nesta terceira e última parte do artigo, vamos codificar nossa aplicação de cadastro de contatos pessoais. Lembrando que no projeto só utilizamos controles nativos do VB6, além de algumas imagens para compor nosso leiaute. Antes de mais nada, vamos renomear os controles do tipo Label, porque eles serão os responsáveis por acionar as rotinas básicas do cadastro.
CaptionName 
ExcluirlblExcluir
SalvarlblSalvar 
Listar contatos cadastradoslblListar 
Incluir contatolblIncluir 
Sair lblSair 

Continuando, vamos adicionar um Module no projeto para alocar as principais rotinas de persistência no banco de dados. Clique no menu Project > Add Module e mantenha o nome de item como Module1.



Copie as linhas de código abaixo e cole no escopo do Module1

Private con As ADODB.Connection
Public rs As ADODB.Recordset

Private Sub Conectar()
Set con = New ADODB.Connection
con.Open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & App.Path & "\Contatos.mdb"
End Sub

Public Sub Desconectar()
con.Close
Set con = Nothing
End Sub

Public Function PesquisarContato(Valor As StringAs Boolean
Dim Criterio As String
Call Conectar
Set rs = New ADODB.Recordset
If Trim(Valor) <> "" Then
    Criterio = " WHERE Codigo=" & Valor
End If
rs.Open "SELECT * FROM Contatos" & Criterio, con, adOpenKeyset, adLockOptimistic
If Not rs.EOF Then
    PesquisarContato = True
Else
    PesquisarContato = False
End If
End Function

Public Sub InserirContato(Nome As String, Endereco As String, Telefone As String, Email As String)
Call Conectar
con.Execute "INSERT INTO Contatos(Nome, Endereco, Telefone, Email) " & _
            "VALUES ('" & Nome & "', '" & Endereco & "', '" & Telefone & "', '" & Email & "')"
Call Desconectar
End Sub

Public Sub AtualizarContato(Codigo As String, Nome As String, Endereco As String, Telefone As String, Email As String)
Call Conectar
con.Execute "UPDATE Contatos " & _
            "SET Nome='" & Nome & "', " & _
            "Endereco='" & Endereco & "', " & _
            "Telefone='" & Telefone & "', " & _
            "Email='" & Email & "' " & _
            "WHERE Codigo=" & Codigo
Call Desconectar
End Sub

Public Sub ExcluirContato(Codigo As String)
Call Conectar
con.Execute "DELETE FROM Contatos WHERE Codigo=" & Codigo
Call Desconectar
End Sub

Precisamos agora, escrever as rotinas no View Code do Form1. Selecione o formulário e pressione a tecla F7 para termos acesso ao editor de códigos. Copie as linhas abaixo e cole no editor.

Private Sub Form_Load()
Call MostrarPainel(0)
Call ListarContato
End Sub

Private Sub imgIncluir_Click()
Call MostrarPainel(1)
End Sub

Private Sub imgListar_Click()
Call MostrarPainel(0)
End Sub

Private Sub imgSair_Click()
End
End Sub

Private Sub lblExcluir_Click()
If lstContato.ListItems.Count > 0 Then
    If MsgBox("Confirma a exclusão do contato '" & lstContato.SelectedItem.ListSubItems(1).Text & "'?", vbYesNo, "Excluir") = vbYesThen
        Call Module1.ExcluirContato(lstContato.SelectedItem.Text)
        Call MostrarPainel(0)
        Call ListarContato
    End If
End If
End Sub

Private Sub lblIncluir_Click()
Call MostrarPainel(1)
Call LimparForm
txtCodigo = "<Novo>"
End Sub

Private Sub lblListar_Click()
Call MostrarPainel(0)
Call ListarContato
End Sub

Private Sub lblSair_Click()
If MsgBox("Deseja sair?", vbYesNo, "Sair") = vbYes Then
    End
End If
End Sub

Private Sub ListarContato()
Dim lst As ListItem
If Module1.PesquisarContato("") = True Then
    lstContato.ListItems.Clear
    Do While Not rs.EOF
        Set lst = lstContato.ListItems.Add(, , rs.Fields("codigo"))
        lst.SubItems(1) = rs.Fields("nome")
        rs.MoveNext
    Loop
    Call Desconectar
End If
End Sub

Private Sub PesquisarContato(Codigo As String)
Dim lst As ListItem
If Module1.PesquisarContato(Codigo) = True Then
    lstContato.ListItems.Clear
    If Not rs.EOF Then
        txtCodigo = rs.Fields("codigo")
        txtNome = rs.Fields("nome")
        txtEndereco = rs.Fields("endereco")
        txtTelefone = rs.Fields("telefone")
        txtEmail = rs.Fields("email")
        Call MostrarPainel(1)
    End If
    Call Desconectar
End If
End Sub

Private Sub MostrarPainel(p As Byte)
If p = 0 Then
    picListar.Left = picIncluir.Left
    picListar.Visible = True
    picIncluir.Visible = False
    lblListar.FontUnderline = True
    lblIncluir.FontUnderline = False
Else
    picListar.Visible = False
    picIncluir.Visible = True
    lblListar.FontUnderline = False
    lblIncluir.FontUnderline = True
End If
End Sub

Private Sub lblSalvar_Click()
If txtCodigo = "<Novo>" Then
    Call Module1.InserirContato(txtNome, txtEndereco, txtTelefone, txtEmail)
Else
    Call Module1.AtualizarContato(txtCodigo, txtNome, txtEndereco, txtTelefone, txtEmail)
End If
Call MostrarPainel(0)
Call ListarContato
End Sub

Private Sub lstContato_DblClick()
If lstContato.ListItems.Count > 0 Then
    Call PesquisarContato(lstContato.SelectedItem.Text)
End If
End Sub

Private Sub LimparForm()
txtNome = ""
txtEndereco = ""
txtTelefone = ""
txtEmail = ""
End Sub

É isso. Só nos resta testar a aplicação e conferir o resultado.


O projeto com o código fonte está disponível no link abaixo.

domingo, 28 de novembro de 2010

Usando o componente reCaptcha (Demonstração)

Demonstração simples de como se utiliza o componente reCaptcha do Google.


Encontre mais informações do controle no endereço abaixo:

terça-feira, 23 de novembro de 2010

Usando o SyntaxHighlighter em ASP.NET

Saudações, pessoal!

Recentemente precisei exibir algumas linhas de código em linguagem C# em uma página ASP.NET. Pesquisando em alguns sites da web, encontrei uma biblioteca escrita em JavaScript (com algumas pitadas de CSS) chamada SyntaxHighlighter.


A biblioteca foi criada em 2004 e é mantida por Alex Gorbatchev no site abaixo: http://alexgorbatchev.com/SyntaxHighlighter/

O foco do artigo é exibir uma sintaxe em linguagem C#, mas ela abrange inúmeras outras linguagens conhecidas por todos. Segue uma listagens de todas as linguagens e seus respectivos scripts:


Brush nameBrush aliasesFile name
ActionScript3as3, actionscript3shBrushAS3.js
Bash/shellbash, shellshBrushBash.js
ColdFusioncf, coldfusionshBrushColdFusion.js
C#c-sharp, csharpshBrushCSharp.js
C++cpp, cshBrushCpp.js
CSScssshBrushCss.js
Delphidelphi, pas, pascalshBrushDelphi.js
Diffdiff, patchshBrushDiff.js
Erlangerl, erlangshBrushErlang.js
GroovygroovyshBrushGroovy.js
JavaScriptjs, jscript, javascriptshBrushJScript.js
JavajavashBrushJava.js
JavaFXjfx, javafxshBrushJavaFX.js
Perlperl, plshBrushPerl.js
PHPphpshBrushPhp.js
Plain Textplain, textshBrushPlain.js
PowerShellps, powershellshBrushPowerShell.js
Pythonpy, pythonshBrushPython.js
Rubyrails, ror, rubyshBrushRuby.js
ScalascalashBrushScala.js
SQLsqlshBrushSql.js
Visual Basicvb, vbnetshBrushVb.js
XMLxml, xhtml, xslt, html, xhtmlshBrushXml.js

A imagem abaixo ilustra o nosso projeto em tempo de execução. 
Para renderizar o SyntaxHighlighter no WebForm utilizamos um controle do tipo Literal, além da tag <pre class="brush: csharp;">Código fonte aqui</pre> para obter o resultado final.



O código fonte está disponível no link abaixo.

Até mais!

domingo, 21 de novembro de 2010

Obtendo as últimas notícias do Terra

E aí, pessoal!


É um contexto, em que a informação é de extrema utilidade, que tal permitir que nossa aplicação apresente notícias atualizadas em tempo real? Pois é, a idéia desse artigo, é utilizar os feeds RSS do portal Terra (mais especificamente, sobre os assuntos de tecnologia) e carregar um Repeater com um DataTable previamente alimentado com XML.


Antes de mais nada, veja como ficará nossa aplicação ASP.NET.





Pois bem, abra o Visual Studio (usaremos a versão 2008 Professional Edition no escopo deste artigo) e crie um novo projeto do tipo Web Site com o nome RssTerra.



Adicione um controle Repeater na página Default.aspx e altere o template (aba Source) adicionando algumas tags conforme as linhas abaixo:


<asp:Repeater ID="Repeater1" runat="server">
  <ItemTemplate>
    <a href="<%# DataBinder.Eval(Container.DataItem, "link") %>" target="_blank">
      <%# DataBinder.Eval(Container.DataItem, "titulo") %>
    </a><br />
    <%# DataBinder.Eval(Container.DataItem, "data") %><br />
    <%# DataBinder.Eval(Container.DataItem, "descricao") %><br />
  </ItemTemplate>
  <SeparatorTemplate>
    <hr style="width: 400px; text-align: left;" />
  </SeparatorTemplate>
</asp:Repeater>

Fazendo algumas pequenas alterações pra melhorar a aparência, confira o código HTML completo da página Default.aspx.



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


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

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>Terra - RSS - Tecnologia</title>
</head>
<body style="font-family: Trebuchet MS; font-size: 11px;">
    <form id="form1" runat="server">
    <div>
        <h2>Últimas notícias de tecnologia do Terra</h2>
        <p>Desenvolvido por Tecla - Programação On-Line</p><br />
       
        <asp:Repeater ID="Repeater1" runat="server">
            <ItemTemplate>
                <a href="<%# DataBinder.Eval(Container.DataItem, "link") %>" target="_blank">
                    <%# DataBinder.Eval(Container.DataItem, "titulo") %>
                </a><br />
                <%# DataBinder.Eval(Container.DataItem, "data") %><br />
                <%# DataBinder.Eval(Container.DataItem, "descricao") %><br />
            </ItemTemplate>
            <SeparatorTemplate>
                <hr style="width: 400px; text-align: left;" />
            </SeparatorTemplate>
        </asp:Repeater>
    </div>
    </form>
</body>
</html>


Após a alteração no Repeater, veja o formato da exibição das notícias na aba Design da página.


A aparência da aplicação está pronta, só nos resta criar a rotina em linguagem C# para obter os dados do Terra através do arquivo XML. Perceba que iremos extrair os elementos do XML e alimentar o DataTable.




using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Xml;
using System.Data;

public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
            this.LerRssTerra();
    }
   
    /// <summary>
    /// Método utilizado para ler o rss de tecnologia do site TERRA
    /// </summary>
    private void LerRssTerra()
    {
        XmlDocument xmlDoc = new XmlDocument();
        xmlDoc.Load("http://rss.terra.com.br/0,,EI12879,00.xml");

        DataTable dt = CriarDataTable();
        XmlNodeList noXml = xmlDoc.SelectNodes("/rss/channel/item");
        foreach (XmlNode no in noXml)
        {
            dt.Rows.Add(no["title"].InnerText,
                        DateTime.Parse(no["pubDate"].InnerText).ToString(),
                        no["description"].InnerText,
                        no["link"].InnerText);
        }
       
        Repeater1.DataSource = dt;
        Repeater1.DataBind();
    }

    /// <summary>
    /// Retorna a estrutura de um DataTable para alocar os elementos do xml
    /// </summary>
    /// <returns>DataTable</returns>
    private DataTable CriarDataTable()
    {
        DataTable dt = new DataTable();
        dt.Columns.Add("titulo", typeof(string));
        dt.Columns.Add("data", typeof(string));
        dt.Columns.Add("descricao", typeof(string));
        dt.Columns.Add("link", typeof(string));
        return dt;
    }
}


Feito isso, vamos executar nossa aplicação web. Pressione a tecla F5 ou clique no menu Debug > Start Debugging. Se tudo correr bem, o resultado será o mesmo da primeira imagem do artigo.

Até a próxima!