Escolar Documentos
Profissional Documentos
Cultura Documentos
Descrição: Neste artigo exploraremos uma grande funcionalidade que facilitará em muito a vida dos desenvolvedores, o trafego de imagens através de
Web Service dentro do Smart Device Extensions.
Criando a Aplicação
Nosso artigo será composto por dois projetos; o primeiro será um Web
Service de nome ProductService e o segundo uma aplicação de nome
PocketBikes.Ambos os projetos serão desenvolvidos em C# e a aplicação
PocketBikes consumirá o Web Service ProductService.Visualizaremos a
tabela Products do banco de dados Bikes dentro de uma datagrid e as
respectivas fotos de cada produto em uma picturebox.
using System;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Web.Services;
namespace DownhillBikes
{
/// <summary>
/// Expõe a relação de produtos através dos Web Methods.
/// </summary>
[WebService(
// Query em Products
SqlDataAdapter da = new SqlDataAdapter(
"SELECT ProductID as ID, ProductName as Product, '$' + convert(varchar(10), UnitPrice, 1) as Price FROM Products", con);
[WebMethod]
public byte[] GetImage(string productId)
{
con.Open();
(int)(image.Width * 0.65F),
(int)(image.Height * 0.65F),
null, IntPtr.Zero);
Visualizando o código acima você perceberá que é necessário criar dentro do arquivo web.config uma key de nome
BikesConnection consumida através de ConfigurationSettings.AppSettings["BikesConnection"]; a seguir inclua o código abaixo
dentro do web.config.
<appSettings>
<add key="BikesConnection" value="server=localhost;database=Bikes;integrated security=SSPI;" />
</appSettings>
O Web Method GetProducts() retorna todos os produtos que tem dentro da tabela Products do banco de dados Bikes e o Web
Method GetImage() recebe como parâmetro uma string que é o código do produto e retorna um MemoryStream com a foto de
cada produto.
using System;
using System.IO;
using System.Drawing;
using System.Collections;
using System.Windows.Forms;
using System.Data;
namespace PocketBikes
{
/// <summary>
/// Summary description for Form1.
/// </summary>
public class Form1 : System.Windows.Forms.Form
{
private System.Windows.Forms.DataGrid dataGrid1;
private System.Windows.Forms.PictureBox pictureBox1;
private System.Windows.Forms.MainMenu mainMenu1;
DownhillBikes.ProductService ws;
bool online = true;
Bitmap imageMissing;
string cacheFolder;
string curId;
return ds;
}
// Cria um bitmap
imageMissing = new Bitmap(pictureBox1.Width, pictureBox1.Height);
// Objetos GDI
Font font = new Font("Arial", 9, FontStyle.Bold);
// Draw do bitmap
Graphics g = Graphics.FromImage(imageMissing);
g.Clear(Color.White);
SizeF size = g.MeasureString(message, font);
g.DrawString(message, font,
new SolidBrush(Color.Gray),
(pictureBox1.Width - size.Width) / 2,
(pictureBox1.Height - size.Height) / 2);
}
public Form1()
{
//
// Required for Windows Form Designer support
//
InitializeComponent();
//
// TODO: Add any constructor code after InitializeComponent call
//
}
/// <summary>
/// Clean up any resources being used.
/// </summary>
protected override void Dispose( bool disposing )
{
base.Dispose( disposing );
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.mainMenu1 = new System.Windows.Forms.MainMenu();
this.dataGrid1 = new System.Windows.Forms.DataGrid();
this.pictureBox1 = new System.Windows.Forms.PictureBox();
//
// dataGrid1
//
this.dataGrid1.Size = new System.Drawing.Size(240, 120);
this.dataGrid1.Text = "dataGrid1";
this.dataGrid1.CurrentCellChanged += new System.EventHandler(this.dataGrid1_CurrentCellChanged);
//
// pictureBox1
//
this.pictureBox1.Location = new System.Drawing.Point(0, 127);
this.pictureBox1.Size = new System.Drawing.Size(240, 137);
this.pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage;
//
// Form1
//
this.Controls.Add(this.pictureBox1);
this.Controls.Add(this.dataGrid1);
this.Menu = this.mainMenu1;
this.MinimizeBox = false;
this.Text = "PocketBikes";
this.Load += new System.EventHandler(this.Form1_Load);
}
#endregion
/// <summary>
/// The main entry point for the application.
/// </summary>
try
{
// Carrega a imagem do Produto em cache
string cacheImage = Path.Combine(cacheFolder, productId + ".gif");
if (File.Exists(cacheImage))
pictureBox1.Image = new Bitmap(cacheImage);
else if (online)
{
Cursor.Current = Cursors.WaitCursor;
// Salva a imagem em cache local (nota: Image.Save não é suportado no .NET CF)
FileStream fs = new FileStream(cacheImage, FileMode.Create);
byte[] bytes = stream.ToArray();
fs.Write(bytes, 0, bytes.Length);
fs.Close();
stream.Close();
Cursor.Current = Cursors.Default;
}
else
pictureBox1.Image = imageMissing;
}
catch
{
online = false;
pictureBox1.Image = imageMissing;
}
}
}
}
Salve o formulário e adicione o Web Service a seu projeto Add Web Reference passando como endereço
http://157.57.236.53/DownhillBikes/ProductService.asmx ( adicione uma Microsoft Loopback Adapter IP 157.57.236.53 )
Quando o formulário é carregado, a datagrid será preenchida com todos os produtos oriundos do retorno do Web Method
GetProducts(), com isso a cada item selecionado na datagrid a picturebox mostrará a foto do produto escolhido.
Figura4. Mostra o Web Service Adicionado ao projeto PocketBikes
Executando a aplicação
Após tudo pronto executaremos a aplicação clicando em F5 e utilizando o emulador para deployment Pocket PC 2003 – SDK
Emulator.
Figura5. Utilizando o emulador para execução da aplicação
Figura6. Visualizando a aplicação
Conclusão
Neste artigo, nós vimos como ler e gravar XML, como trabalhar em local cache, utilizar bitmap e memorystream e trafegar fotos
através de Web Services usando o SDE do Visual Studio .NET 2003.
Sobre o Autor
Maycol Sneider Romelli é integrante do Seminar Group da Microsoft Brasil, aonde ministra palestras na área de
desenvolvimento, é também escritor de várias revistas e sites no Brasil como: Revista MSDN Magazine, Revista Desenvolvedor,
Revista SQL Magazine, Revista Developers Magazine, Site MSDN Brazil e Site Linha de Código. Colaborou também com as
extintas revistas .NET Magazine e VSPJ.