dez 13

Este erro, ao contrário do que os outros pensam, não é do Chrome ou do Safari e sim do próprio ASP.NET.

Para gerar o código JavaScript do menu, o ASP.NET verifica qual é o browser do cliente, e se ele suporta ou não JavaScript. Acontece que esta verificação falha em alguns browsers como o Sarafi e consequentemente o Chrome (pois o Chrome foi baseado no Safari), e o  ASP.NET então devolve um código que não funciona. Para corrigir isto devemos “forçar” o ASP.NET a executar o JavaScript, para isto setamos a propriedade Page.ClientTarget com o valor “uplevel”. Assim informamos que o cliente possui um moderno “uplevel” browser.

Devemos fazer isto para todas as páginas que utilizarão o menu. O código deverá estar dentro do evento Page_Init da página. Ex:

     protected void Page_PreInit(object sender, EventArgs e)
    {
        if (Page.Request.ServerVariables["http_user_agent"].ToLower().Contains("safari"))
        {
            Page.ClientTarget = "uplevel";
        }
    }

Neste código, fazemos uma verificação se o user_agent possui a palavra safari, que servirá também pro chrome  e, se sim, forçamos o uplevel.

Para evitar de “copiar” e “colar” o mesmo código em todas as páginas, você poderá aproveitar o que há de melhor da programação orienteda a objetos, a herânça. Para isto crie uma classe herdando de System.Web.UI.Page e coloque este código nela. Para todas as suas páginas, ao invés de herdar diretamente de System.Web.UI.Page, você herda da classe que acabou de criar.


View this Post in: English French Italian Spanish

out 22

Para obter informações de um arquivo tais como data e hora de criação, modificação, acesso entre outros, utilizamos a classe FileInfo. Esta classe, presente no namespace System.IO possui as propriedades CreationTime, LastWriteTime e LastAccessTime que retorna a informação de data e hora que o arquivo foi criado, modificado e aberto. Veja um exemplo de como utilizar a classe

FileInfo file_info = new FileInfo("C:\\meu_arquivo.txt");

string Criado = file_info.CreationTime.ToString("dd/MM/yyyy HH:mm:ss");
string Modificado = file_info.LastWriteTime.ToString("dd/MM/yyyy HH:mm:ss");
string Acessado = file_info.LastAccessTime.ToString("dd/MM/yyyy HH:mm:ss");

Se preferir pode fazer o download do projeto abaixo com um exemplo que mostra estas e outras propriedades da classe FileInfo.
Exemplo de uso da classe FileInfo (108)


View this Post in: English French Italian Spanish

out 19

Já mostrei aqui como obter o dia da semana por extenso no charp. Para poder escrever a data completa no formato “[dia da semana], [dia] de [mês] de [ano]” basta obter separadamente cada uma das partes como no exemplo a seguir.

        CultureInfo culture = new CultureInfo("pt-BR");
        DateTimeFormatInfo dtfi = culture.DateTimeFormat;

        int dia = DateTime.Now.Day;
        int ano = DateTime.Now.Year;
        string mes = culture.TextInfo.ToTitleCase(dtfi.GetMonthName(DateTime.Now.Month));
        string diasemana = culture.TextInfo.ToTitleCase(dtfi.GetDayName(DateTime.Now.DayOfWeek));
        string data = diasemana + ", " + dia + " de " + mes + " de " + ano;

        Response.Write(data);

O método ToTitleCase da classe TextInfo serve para converter a primeira letra da palavra para maiúsculo e os métodos GetMonthName e GetDayName da classe DateTimeFormatInfo servem para pegar o nome do mês e do dia da semana respectivamente.

No final a variável data conterá o dia por extenso. Por exemplo:

Domingo, 19 de Outubro de 2008

Para os dias menores que 10, se você preferir escreve-los com o zero antes basta aplicar o método ToString a variável dia.

string data = diasemana + ", " + dia.ToString("00") + " de " + mes + " de " + ano;

View this Post in: English French Italian Spanish

out 15

Depois de alguns dias pesquisando, encontrei algumas soluções viáveis para enviar um arquivo diretamente para a impressora (sem abrir janelas de diálogo), cada uma com suas limitações.


Solução 1: Fazer uma cópia do arquivo para o local da impressora

 

No prompt do DOS basta utilizar o comando:

copy nome_arquivo nome_impressora

O equivalente em C# é:

System.IO.File.Copy(nome_arquivo , nome_impressora);

Onde nome_arquivo é o nome físico completo do arquivo e nome_impressora é o nome do compartilhamento da impressora composto pelo IP ou nome da máquina mais o nome do compartilhamento.

Limitação: Imprime somente arquivos texto e a impressora deverá estar compartilhada.


Solução 2: Utilizar o comando print do windows.

Esta foi a melhor solução que encontrei. A idéia é utilizar o comando “print” do shell do Windows. Ao executar o comando, o Windows irá abrir o programa padrão estabelecido pelo tipo do arquivo e imprimir automaticamente, fechando o programa após a impressão.

Em Delphi utiliza-se o comando ShellExecute para executar um comando shell.

ShellExecute(Handle, 'print',PChar('arquivo'), nil,nil,SW_SHOW);

No Framework .Net não existe esta função, no entanto ela está implementada na dll shell32.dll do Windows. Para utiliza-la em C#, VB6 ou VB .Net devemos criar uma referência para a mesma.

[DllImport("shell32.dll", EntryPoint = "ShellExecute")]
public static extern int ShellExecuteA(int hwnd, string lpOperation,
     string lpFile, string lpParameters, string lpDirectory, int nShowCmd);

Para utilizar a directiva DllImport é preciso referênciar o namespace System.Runtime.InteropServices.
Veja o exemplo a seguir utilizado em um projeto do tipo Windows Application.

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

namespace ImprimeArquivo
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            OpenFileDialog ofd = new OpenFileDialog();
            if (ofd.ShowDialog() == DialogResult.OK)
            {
                Form1.ShellExecuteA(this.Handle.ToInt32(), "print", ofd.FileName, null, null, 0);
            }
        }

        [DllImport("shell32.dll", EntryPoint = "ShellExecute")]
        public static extern int ShellExecuteA(int hwnd, string lpOperation,
              string lpFile, string lpParameters, string lpDirectory, int nShowCmd);
    }
}

Solução 3: http://support.microsoft.com/kb/322091/pt-br


View this Post in: English French Italian Spanish

out 06

Para saber a versão de uma dll criada a partir de um projeto do tipo Class Library basta utilizar o código:

typeof(NomedaSuaClasse).Assembly.GetName().Version;

Ou, se você chamar a instrução de dentro da classe, poderá fazer:

this.GetType().Assembly.GetName().Version;

Esses métodos retornam um objeto do tipo Version, que pode ser utilizado para pegar separadamente cada tipo de versão. Por exemplo, a versão de compilação, a maior verão, a menor versão, etc…

O código abaixo exemplifica o uso destes métodos em uma classe que pode ser chamada por exemplo em uma aplicação Web ou WinForm.

public class Info
{
    public static Version GetVersion()
    {
        return typeof(Info).Assembly.GetName().Version;
    }

    public static string GetVersionString()
    {
        Version version = Info.GetVersion();
        string versionstring = version.Major + "." + version.Minor +
            "." + version.Build + "." + version.Revision;
        return versionstring;
    }
}

Para chamar este método em sua aplicação faça por exemplo:

label.Text = "Versão:" + Info.GetVersionString();

Se estiver trabalhando com WinForms, você poderá usar o código abaixo para saber a versão do exe de sua aplicação:

Assembly.GetEntryAssembly().GetName().Version

Da mesma maneira que no exemplo anterior com a dll, poderá ser criado uma classe somente para retornar esta informação.

Obs.: Para alterar a versão da dll basta ir nas propriedades do projeto e na guia Application clique no botão “Assembly Information” como na figura abaixo.


View this Post in: English French Italian Spanish

out 05

Para pegar o valor de uma string de conexão do Web.Config basta utilizar a classe ConfigurationManager. Veja um exemplo:

string cs = ConfigurationManager.ConnectionStrings["strConn"].ConnectionString;

Onde strConn é o nome dado a sua string de conexão no Web.Config. Veja um exemplo do Web.Config:

<?xml version="1.0"?>
<configuration>
    <connectionStrings>
       <add name="strConn"
	connectionString="Data Source=192.168.0.1;Initial Catalog=Banco;
User ID=Usuario;Password=Senha;"
	providerName="System.Data.SqlClient"/>
    </connectionStrings>   
</configuration>

Se você se deparar com o erro “The name ‘ConfigurationManager’ does not exist in the current context” é porque provavelmente você está tentando pegar o valor desta string em um projeto do tipo Class Library. Para solucionar este problema basta referenciar no seu projeto a dll System.configuration.


View this Post in: English French Italian Spanish

set 30

Dígito verificador ou algarismo de controle é um mecanismo de autenticação utilizado para verificar a validade e a autenticidade de um valor numérico, evitando dessa forma fraudes ou erros de transmissão ou digitação.

É usado normalmente em representações numéricas que exijam integridade, como por exemplo CPF, CNPJ, RG.

O método de cálculo desses dígitos varia conforme o caso, porém muitos deles se baseiam em duas rotinas tradicionais: Módulo 11 e Módulo 10.

O cálculo do Módulo 10 é feito da seguinte maneira:

Cada dígito do número, começando da direita para a esquerda (menos significativo para o mais significativo) é multiplicado, na ordem, por 2, depois 1, depois 2, depois 1 e assim sucessivamente.

Número exemplo: 261533-4

  +---+---+---+---+---+---+   +---+
  | 2 | 6 | 1 | 5 | 3 | 3 | - | 4 |
  +---+---+---+---+---+---+   +---+
    |   |   |   |   |   |
   x1  x2  x1  x2  x1  x2
    |   |   |   |   |   |
   =2 =12  =1 =10  =3  =6
    +---+---+---+---+---+-> = (16 / 10) = 1, resto 6 => DV = (10 - 6) = 4

A função abaixo traduz este esquema na linguagem CSharp e poderá ser utilizada em seus projetos .net.

private string modulo10(string str)
{
    int digito=0;
    int flag=2;
    str=str.Substring(0,str.Length - 1);
    for (int i = str.Length-1; i >= 0; i--)
    {
        int valor = Convert.ToInt32(str[i].ToString()) * flag;
        int soma = 0;
        if (valor.ToString().Length > 1)
        {
            string svalor = valor.ToString();
            for (int j = 0; j < svalor.Length; j++)
            {
                soma += Convert.ToInt32(svalor[j].ToString());
            }
        }
        else
        {
            soma = valor;
        }
        digito += soma;
        flag = (flag == 2) ? 1 : 2;
    }
    digito = digito % 10;
    digito = 10 - digito;
    if (digito == 10)
    {
        digito = 0;
    }
    return digito.ToString();

}

Obs.: Todo o texto didático deste post foi extraído da Wikipédia obedecendo a licença GNU da mesma.


View this Post in: English French Italian Spanish

set 29

Fonetizar significa examinar a palavra sob o ponto de vista fonético. Analisar as partes da palavra pelo seu som e não pela escrita. Por exemplo: O nome Felipe pode ter várias variações como Filipe, Filipi, Filipe, Philipe, Phelipe, Phelipi.  Ao fonetizar esses nomes, chegamos sempre no mesmo resultado (FILIPI). 

A fonetização é muito útil para a utilização de buscas aproximadas. No exemplo acima, ao buscarmos o nome Felipe, poderíamos ter como retorno resultados contendo todos as outras variações do nome Felipe.

Para testar, você poderá baixar a classe de fonetização reescrita por mim em c# e utiliza-la em seu projeto .net. Para utilizar-la  basta chamar o método estático Fonetiza da classe Fonetico do Namespace Util. 

Ex.:

Response.Write(Util.Fonetico.Fonetiza("Felipe"));

Download
Classe para Fonetizar Textos (448) - 52 KB

nota
O código original estava escrito em Java e confesso que já não lembro onde consegui, para que assim colocasse os créditos devidos aqui.


View this Post in: English French Italian Spanish

set 25

Por padrão, não se pode atribuir um valor nulo em variáveis do tipo Int32, Double, DateTime entre outros tipos. Para que isto seja possível devemos usar a classe Nullable. A definição da variável fica da seguinte forma:

Nullable<tipo> nome_varival;

Para atribuir um valou null a um inteiro, devemos fazer;

Nullable<int> nome_varival = null;

No entanto, para pegar o valor da variável devemos usar a propriedade Value e para saber se a variável possui valor a propriedade HasValue.

if (nome_varival .HasValue)
   return nome_varival.Value;

View this Post in: English French Italian Spanish

set 23

Este algoritmo só é válido para um ArrayList com itens do tipo Int32.
Primeiramente devemos ordenar o ArrayList para simplificar a busca de itens iguais. Para isso basta utilizar o método Sort. Depois, utilizando um simples laço ‘for’ percorremos o vetor em busca das repetições. Veja o código abaixo e você entenderá.

        ArrayList vet = new ArrayList();
        vet.Add(9);
        vet.Add(5);
        vet.Add(1);
        vet.Add(7);
        vet.Add(2);
        vet.Add(10);
        vet.Add(9);
        vet.Add(7);
        vet.Add(7);
        vet.Add(6);
        vet.Add(10);
        vet.Add(8);
        vet.Add(4);
        vet.Add(1);
        vet.Add(9);

        // ordenado o vetor
        vet.Sort();

        int anterior = Convert.ToInt32(vet[0]);
        for (int i = 1; i < vet.Count; i++)
        {
            int atual = Convert.ToInt32(vet[i]);
            if (atual == anterior)
            {
                vet.RemoveAt(i);
                i--;
            }
            else
            {
                anterior = atual;
            }

        }

        // escrevendo os itens do vetor na tela
        for (int i = 0; i < vet.Count; i++)
        {
            Response.Write(vet[i].ToString() + " - ");
        }

View this Post in: English French Italian Spanish