- 16 Outubro 2011
- Uncategorized
- 1 Comments
Currently Browsing
Posts Tagged ‘ C# ’
- 14 Abril 2011
- Sem categoria
- 0 Comments
Uma maneira rápida de ter um menu a funcionar no nosso website, é recorrer ao controlo Menu e associá-lo a um web.sitemap usando o SiteMapDataSource.
Exemplo do ficheiro web.sitemap:
<?xml version="1.0" encoding="utf-8" ?> <siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" > <siteMapNode url="~/" title="Home" description="Home" > <siteMapNode url="" description="Menu 1" title="Menu 1"> <siteMapNode url="" description="SubMenu 1" title="Sub Menu 1"/> </siteMapNode> <siteMapNode url="" description="Menu 2" title="Menu 2"/> <siteMapNode url="" description="Menu 3" title="Menu 3"/> </siteMapNode> </siteMap>
Exemplo do código para adicionar na página o menu:
<asp:Menu ID="NavigationMenu" runat="server" CssClass="menu" EnableViewState="False" IncludeStyleBlock="False" Orientation="Horizontal" DataSourceID="SiteMapDataSource1" onmenuitemdatabound="NavigationMenu_MenuItemDataBound"> </asp:Menu> <asp:SiteMapDataSource ID="SiteMapDataSource1" runat="server" ShowStartingNode="false" />
Correndo a aplicação, iremos ter algo como a próxima imagem:

Para mostrar ou esconder os menus, consoante o tipo de acesso de cada utilizador, podemos definir as Roles em cada SiteMapNode.
Outra forma de controlar os menus visiveis, é adicionar um atributo em cada SiteMapNode e consoante o seu valor, irá ou não mostrar cada um dos menus.
Para isso, o web.sitemap será algo como:
<?xml version="1.0" encoding="utf-8"?> <siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0"> <siteMapNode url="~/" title="Home" description="Home" visible="true"> <siteMapNode url="" description="Menu 1" title="Menu 1" visible="true"> <siteMapNode url="" description="SubMenu 1" title="Sub Menu 1" visible="true" /> </siteMapNode> <siteMapNode url="" description="Menu 2" title="Menu 2" visible="False" /> <siteMapNode url="" description="Menu 3" title="Menu 3" visible="true" /> </siteMapNode> </siteMap>
O atributo “visible” é que nos vai indicar se o menu é ou não mostrado, e para isso vamos adicionar ao evento MenuItemDataBound do Menu o seguinte código:
protected void NavigationMenu_MenuItemDataBound(object sender, MenuEventArgs e)
{
SiteMapNode node = e.Item.DataItem as SiteMapNode;
if (!string.IsNullOrEmpty(node["visible"]))
{
bool isVisible;
if (bool.TryParse(node["visible"], out isVisible))
{
if (!isVisible)
{
if (e.Item.Parent != null)
e.Item.Parent.ChildItems.Remove(e.Item);
else
((Menu)sender).Items.Remove(e.Item);
}
}
}
}
Desta forma, teremos o nosso menu a mostrar todos os nós cujo valor do atributo Visible seja igual a True.
Para podermos controlar directamente os menus que irão estar ou não visiveis, utilizei uma Treeview para carregar o ficheiro web.sitemap, definir que todos os items mostrarão uma checkbox, que irá indicar o estado do atributo Visible.
<asp:TreeView runat="server" ID="tvMenus" AutoGenerateDataBindings="False" DataSourceID="XmlDsSiteMap" OnTreeNodeCheckChanged="tvMenus_TreeNodeCheckChanged" ShowCheckBoxes="All" ShowLines="True" OnTreeNodeDataBound="tvMenus_TreeNodeDataBound"> <DataBindings> <asp:TreeNodeBinding DataMember="siteMapNode" SelectAction="None" ShowCheckBox="True" TextField="title" /> <asp:TreeNodeBinding DataMember="siteMapNode" TextField="title" /> <asp:TreeNodeBinding DataMember="siteMapNode" TextField="title" /> <asp:TreeNodeBinding DataMember="siteMap" /> </DataBindings> </asp:TreeView> <asp:XmlDataSource ID="XmlDsSiteMap" runat="server" DataFile="~/Web.sitemap" XPath="/*/*/*"> </asp:XmlDataSource> <p> <asp:Button runat="server" ID="btn" Text="gravar" OnClick="btn_Click" /></p>
protected void tvMenus_TreeNodeDataBound(object sender, TreeNodeEventArgs e)
{
XmlElement node = e.Node.DataItem as XmlElement;
if (node.Attributes["visible"] != null)
{
if (!string.IsNullOrEmpty(node.Attributes["visible"].Value))
{
bool isVisible;
if (bool.TryParse(node.Attributes["visible"].Value, out isVisible))
{
e.Node.Checked = isVisible;
}
else
e.Node.Checked = true;
}
else
e.Node.Checked = true;
}
}

Por fim, para gravarmos as alterações do atributo consoante o estado da checkbox, adicionamos ao evento TreeNodeCheckChanged da Treeview o seguinte código:
protected void tvMenus_TreeNodeCheckChanged(object sender, TreeNodeEventArgs e)
{
XmlDsSiteMap.GetXmlDocument().SelectSingleNode(e.Node.DataPath).Attributes["visible"].Value = e.Node.Checked.ToString();
}
E ao botão que adicionamos para gravar as alterações o seguinte código:
protected void btn_Click(object sender, EventArgs e)
{
XmlDsSiteMap.Save();
}
Agora é só activar e desactivar os items ao nosso gosto.

- 1 Abril 2011
- Sem categoria
- 0 Comments
Pois é, a TDT já anda aí, e por razões que não interessam, precisei de retornar todos os instaladores por cada código postal, cuja PT indica como sendo um instalador habilitado.
Para tal, fiz uma pequena aplicação que enviada um pedido com o código postal, e interpretava o resultado retornado em JSON.
Primeiro tive que criar um ficheiro de texto com todos os códigos postais. Podem fazer download do que usei aqui.
O código poderá não ser o melhor, mas fez o que pretendia e não precisei de me chatear mais com o assunto.
using System;
using System.Collections.Generic;
using System.Net;
using System.IO;
using System.Web.Script.Serialization;
namespace WebApplication1
{
public class CPs
{
public string cp4 { get; set; }
public string cp3 { get; set; }
}
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
GetData();
}
private void GetData()
{
List<CPs> cps = new List<CPs>();
TextReader t = new StreamReader(@"C:cps.txt");
string line = "";
t.ReadLine();
while (t.Peek() > 0)
{
line = t.ReadLine();
cps.Add(new CPs() { cp4 = line.Split('-')[0].ToString(), cp3 = line.Split('-')[1].ToString() });
}
HttpWebRequest request = null;
foreach (CPs cp in cps)
{
try
{
request = (HttpWebRequest)HttpWebRequest.Create(@"http://tdt.telecom.pt/handlers/installerSearch.ashx?cp4=" + cp.cp4 + "&cp3=" + cp.cp3);
request.ContentType = "application/json; charset=utf-8";
request.Accept = "application/json, text/javascript, */*";
WebResponse response = request.GetResponse();
Stream stream = response.GetResponseStream();
string json = "";
using (StreamReader reader = new StreamReader(stream))
{
while (!reader.EndOfStream)
{
json += reader.ReadLine();
}
}
JavaScriptSerializer serializer = new JavaScriptSerializer();
Dictionary<string, object> x = (Dictionary<string, object>)serializer.DeserializeObject(json);
if (x.Count > 0)
Response.Write(cp.cp4 + ";" + cp.cp3 + ";" + x["name"].ToString() + ";" + x["phoneNumber1"].ToString() + ";" + x["phoneNumber2"].ToString() + "<br />");
}
catch (Exception)
{
}
}
}
}
}
- 3 Março 2011
- Sem categoria
- 1 Comments
Uma forma rápida de criarmos um ficheiro Zip, é recorrendo à classe ZipPackage do WindowsBase.dll.
Para tal, precisamos de adicionar a referencia a esta dll ao nosso projecto, que no meu caso está em “C:Program Files (x86)Reference AssembliesMicrosoftFramework.NETFrameworkv4.0ProfileClientWindowsBase.dll”.
Podemos criar agora uma classe com um método para criar o ficheiro Zip com os ficheiros que queremos.
public static void CreateZipFile(string zipFilename, List<string> files, CompressionOption compression, bool deleteFilesAfterZip) { long bsize = 4096; byte[] b = new byte[bsize]; int bytesRead = 0; long bytesWritten = 0; using (Package zip = System.IO.Packaging.Package.Open(zipFilename, FileMode.OpenOrCreate)) { foreach (string file in files) { Uri uri = PackUriHelper.CreatePartUri(new Uri(file, UriKind.Absolute)); if (zip.PartExists(uri)) zip.DeletePart(uri); PackagePart part = zip.CreatePart(uri, "", compression); using (FileStream stream = new FileStream(file, FileMode.Open, FileAccess.Read)) { using (Stream dest = part.GetStream()) { while ((bytesRead = stream.Read(b, 0, b.Length)) != 0) { dest.Write(b, 0, bytesRead); bytesWritten += bsize; } } } } } if (deleteFilesAfterZip) DeleteFiles(files); }
Adicionei um parametro (deleteFilesAfterZip) que vai remover todos os ficheiros que foram incluidos no Zip, apenas para me facilitar o trabalho, mas não é obrigatório.
A função DeleteFiles() será algo parecido com isto:
private static void DeleteFiles(List<string> files) { foreach (string file in files) { FileInfo f = new FileInfo(file); if (!f.Exists) throw new FileNotFoundException(); f.Delete(); } }
Por fim, para chamarmos a função que cria o ficheiro Zip basta um simples
ZIP.CreateZipFile("c:\xpto.zip", new List<string>() { "c:\xpto.txt", "c:\xpto1.txt" }, System.IO.Packaging.CompressionOption.Normal, false);
Referências:
http://msdn.microsoft.com/en-us/library/system.io.packaging.aspx
http://msdn.microsoft.com/en-us/library/system.io.packaging.zippackage.aspx
- 26 Fevereiro 2011
- Sem categoria
- 0 Comments
O NLog é um sistema de blogs desenvolvido em ASP.NET MVC 3, Razor, JQuery e C#.
Podem ver em funcionamento em http://chrisfulstow.com/ ou http://blog.appharbor.com/
Este projecto está disponivel para download no CodePlex.
- 19 Janeiro 2011
- Sem categoria
- 1 Comments
Estão disponiveis no site ASP.NET uma série de tutoriais sobre Entity Framework. Cada um contem ainda um exemplo para download em C# e VB.NET.
The Entity Framework and ASP.NET – Getting Started Part 1
The Entity Framework and ASP.NET – Getting Started Part 2
The Entity Framework and ASP.NET – Getting Started Part 3
The Entity Framework and ASP.NET – Getting Started Part 4
The Entity Framework and ASP.NET – Getting Started Part 5
The Entity Framework and ASP.NET – Getting Started Part 6
The Entity Framework and ASP.NET – Getting Started Part 7
The Entity Framework and ASP.NET – Getting Started Part 8
- 1 Novembro 2010
- Sem categoria
- 1 Comments
Download a CTP with new syntax and APIs for asynchronous development.
Whitepaper: Asynchrony in .NET
Get an overview of the new asynchronous features being developed for C#, Visual Basic and the .NET Framework.
Walkthrough: Getting Started with Async
Follow step-by-step instructions for converting a synchronous solution in Visual Basic or C# to an asynchronous one by using the new asynchronous features.
Learn about the iterators that this CTP introduces in Visual Basic. An iterator function or get accessor performs a custom iteration over a collection, and uses the Yield statement to return each element in turn.
101 Samples in C# and Visual Basic
Download the CTP and then use the 101 samples (in DocumentsMicrosoft Visual Studio Async CTPSamples) to try the new Async CTP features yourself. Check back for an online version coming soon.
- 24 Abril 2010
- Sem categoria
- 0 Comments
Hoje andei a dar uma olhadela à API do serviço bit.ly. Para utilizarmos basta mesmo criar uma conta, e com a key que gera para utilizarmos a API rapidamente fazemos qualquer brincadeira.
Segue um exemplo rápido de como gerar um link curto a partir da URL inserida.
string username = "username";
string api = "your_api_key";
using (WebClient w = new WebClient())
{
string LongUrl = "http://blog.tiagosalgado.com";
string bitLyUrl =string.Format("http://api.bit.ly/v3/shorten?login={0}&apiKey={1}&uri={2}&format=txt",username,api,LongUrl);
string ShortUrl = w.DownloadString(bitLyUrl);
Console.Write(ShortUrl);
Console.Read();
}
E temos algo como isto:

- 15 Abril 2010
- Sem categoria
- 0 Comments
Hoje o meu colega de trabalho pediu-me para o ajudar a extrair uma parte do texto de uma página p/ ser posteriormente enviado.
Não se trata nada de complexo, apenas apeteceu-me deixar aqui p/ consultar mais tarde caso precise
O HTML da página que deve ser pesquisado é algo como:
<TD valign=top colspan=6>TESTE 1XPTO ONLINE</TD>
Para o fazer, fiz o seguinte código:
Regex r = new Regex("<TD(.*?)>(.*?)</TD>");
string s = @"<TD valign=top colspan=6>TESTE 1XPTO ONLINE</TD>
<TD valign=top colspan=6>TESTE 2XPTO ONLINE</TD>
<TD valign=top colspan=6>TESTE 3XPTO ONLINE</TD>
<TD valign=top colspan=6>TESTE 4XPTO ONLINE</TD>
<TD valign=top colspan=6>TESTE 5XPTO ONLINE</TD>";
MatchCollection mc = r.Matches(s);
foreach (Match m in mc)
{
Console.WriteLine(m.Groups[2].Value.Trim());
}
Outra forma de fazer o mesmo, e recorrendo ao LINQ, é esta:
var q = from Match m in new Regex(@"<TD(.*?)>(.*?)</TD>").Matches(s)
select m.Groups[2].Value.Trim();
q.ToArray<string>().ToList().ForEach(new Action<string>(EnviarSinais));
Por fim, basta criar a função EnviarSinais:
static void EnviarSinais(string str)
{
Console.WriteLine(str);
}
Quanto ao código em LINQ, se houver melhor forma de o fazer, indiquem pf
- 18 Maio 2009
- Uncategorized
- 0 Comments
Foi lançado o livro de LINQ com C#, escrito pelo Paulo Morgado e pelo Luis Abreu.
Certamente que temos aqui uma boa referência para este tema, tendo em conta a qualidade de informação que estamos habituados a ver cedidas por ambos os autores.




