quinta-feira, 18 de dezembro de 2014

Serializando entidades do LINQ

Fala galera,

Após um longo período de inatividade vou compartilhar um código para serialização/deserialização de objetos do LINQ.

No meu caso, era preciso armazenar uma lista de objetos do LINQ em sessão. Porém, o sessionstate mode foi alterado de in-proc para sqlserver.

Com isso, passou a ocorrer erro pois o framework informava que a minha entidade no LINQ não era serializável. A solução foi serializar os objetos utilizando a classe "DataContractJsonSerializer".

Seguem os métodos para serialização e deserialização dos objetos:

public static MemoryStream SerializeObject(object obj)
{
MemoryStream stream1 = new MemoryStream();
DataContractJsonSerializer ser = new DataContractJsonSerializer(obj.GetType());
ser.WriteObject(stream1, obj);
return stream1;
}

public static object DeserializeObject(object obj, MemoryStream stream)
{
DataContractJsonSerializer ser = new DataContractJsonSerializer(obj.GetType());
stream.Position = 0;
return ser.ReadObject(stream);
}

Abraços e até a próxima!!

quinta-feira, 5 de junho de 2014

Copiando um diretório recursivamente

Fala galera,

Quem já precisou criar uma cópia de um diretório já deve ter notado que a função Copy que existe na classe System.IO.File não está presente na classe System.IO.Directory.

Segue então um código para quem precisa fazer cópia de um diretório e toda sua estrutura (arquivos e subdiretórios):

public void copyFolder(string oldFolder, string newFolder)
{
    if (!Directory.Exists(newFolder))
        Directory.CreateDirectory(newFolder);

    string[] files = Directory.GetFiles(oldFolder);
    foreach (string file in files)
   {
       string name = Path.GetFileName(file);
       string dest = Path.Combine(newFolder, name);
       File.Copy(file, dest);
   }
   string[] folders = Directory.GetDirectories(oldFolder);
   foreach (string folder in folders)
  {
     string name = Path.GetFileName(folder);
     string dest = Path.Combine(newFolder, name);
     copyFolder(folder, dest);
  }
}


Um abraço e até a próxima!!

quarta-feira, 12 de fevereiro de 2014

Executando métodos em novas Threads com passagem de parâmetros

Fala galera,

Segue um código rápido para quem precisa executar métodos em threads separadas da thread principal com passagem de parâmetros:


public void meuMetodo(string param1, string param2)
{
}
Thread t = new Thread(()=>meuMetodo("abc", "def"));
t.Start();

Um abraço e até a próxima!!

quinta-feira, 6 de fevereiro de 2014

Timeout ao utilizar HttpWebRequest com protocolo HTTPS

Fala galera,

Segue mais um código pra contornar um problema comum no .net para quem precisa trabalhar com WebRequests acessando uma url através do protocolo HTTPS.

O erro que costuma ocorrer é uma mensagem de "Timeout exceeded" (Tempo limite excedido) e a solução é bastante simples. Basta adicionar as 2 linhas abaixo:

//Esta linha fará com que o certificado não seja validado (Útil em casos onde há problemas com o ceritificado)
System.Net.ServicePointManager.CheckCertificateRevocationList = false;

//Esta linha fará com que o tipo de protocolo de segurança a ser utilizado seja o SSL3 ao invés do TLS (que parece ser o protocolo padrão)
System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Ssl3;


Um abraço e até a próxima!!

quarta-feira, 30 de outubro de 2013

Ajaxtoolkit - cannot read property '_notified' of null

Fala, galera!!

Hoje me deparei com a seguinte mensagem de erro ao utilizar um AutocompleteExtender dentro de um updatepanel associado a um updateprogress: "Cannot read property '_notified' of null".

 O mais estranho é que o erro só acontece no Google Chrome. Após uma breve pesquisa, descobri que o erro trata-se de um problema no código de detecção do browser do arquivo MicrosoftAjax.js que não detecta o webkit.

 O webkit é um mecanismo de renderização de páginas utilizado por browsers como o Google Chrome e Safari.

Para contornar esse problema basta incluir o código abaixo na sua página aspx:
 <script type="text/javascript">

Sys.Browser.WebKit = {};
if (navigator.userAgent.indexOf('WebKit/') > -1) {
    Sys.Browser.agent = Sys.Browser.WebKit;
    Sys.Browser.version = parseFloat(navigator.userAgent.match(/WebKit\/(\d+(\.\d+)?)/)[1]);
    Sys.Browser.name = 'WebKit';
 }

</script>

 Um abraço e até a próxima!!

sábado, 10 de agosto de 2013

Desabilitando itens no dropdownlist

Fala galera,

Após muito tempo de inatividade no blog, segue mais um compartilhamento de código.
Durante essa semana me deparei com a necessidade de categorizar os itens dentro de um dropdownlist.

Algo mais ou menos assim:

Categoria 1
--- item 1.1
--- item 1.2
--- item 1.3
Categoria 2
--- item 2.1
--- item 2.2
--- item 2.3

Acontece que os itens "categoria 1" e "categoria 2" são apenas informativos e não podem ser selecionáveis.
Para isso, é preciso desabilitar a opção de seleção desses itens.

Definir o atributo "enabled" no server-side como false não soluciona o problema. É preciso trabalhar com os atributos no lado do cliente.

Segue então o código para desabilitar o item no dropdown:

System.Web.UI.WebControls.ListItem item = ddl.Items.FindByValue("[valor]");
if (item != null)
{
   item.Attributes.Add("style""color:gray;");
   item.Attributes.Add("disabled""true");
}

Onde [valor] corresponde ao valor que identifica o item(propriedade value) que deve ser desabilitado.



Um abraço e até a próxima!!

quarta-feira, 26 de dezembro de 2012

Ordenação de dados em Gridview

Fala, galera!!

Hoje postarei uma solução simples utilizando JQuery para uma tarefa um pouco trabalhosa se feita via C# puro: Ordenação de dados em GridView.

Para isso, utilizaremos o plugin TableSorter para Jquery que pode ser encontrado em http://tablesorter.com/docs/.

Para começar, adicione o seguinte código ao code-behind para que sejam incluídas na sua gridview as seções <thead> e <tbody> que serão utilizadas pelo TableSorter:


protected void GridView1_PreRender(object sender, EventArgs e)
        {
           //As 2 linhas abaixo só devem ser adicionadas se você não estiver utilizando ObjectDataSource,   SqlDataSource ou LinqDataSource
            GridView1.DataSource = "SEU DATASOURCE";
            GridView1.DataBind();
            if (GridView1.Rows.Count > 0)
            {
                //Substitui <td> por <th>
                GridView1.UseAccessibleHeader = true;
                //Adiciona <thead> e <tbody>
                GridView1.HeaderRow.TableSection = TableRowSection.TableHeader;
            }
        }

Adicione as referências e o script abaixo em sua página ASPX e seu gridview estará com a ordenação funcionando:

<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>

<script type="text/javascript" src="/script/tablesorter/jquery.tablesorter.js"></script>

<link rel="stylesheet" href="/script/tablesorter/themes/blue/style.css" type="text/css"  id="" media="print, projection, screen" />


$(document).ready(function() {
       $("#<%=GridView1.ClientID%>").tablesorter();
});

É possível a criação de widgets que fazem com que a ordenação selecionada seja persistida durante a sessão do usuário. Mais informações em: http://ybits.net/2009/10/making-jquery-tablesorter-persistent/

Um abraço e até a próxima!!