WPF - DataBinding com MySQL no SharpDevelop 4.0


Já faz algum tempo que eu não publico um artigo usando o SharpDevelop.

O SharpDevelop é uma IDE gratuita para desenvolvedores .NET, de custos mais brandos do que esta, e com suportes semelhantes. A solução impressiona principalmente pela velocidade com que permite a edição dos trabalhos. O que é interessante é que isso derruba alguns mitos de que .NET não possui um bom desempenho.

O SharpDevelop é uma excelente ferramenta para auxiliar programadores a desenvolver aplicações na plataforma Microsoft .NET de maneira ágil e descomplicada. Além de uma interface leve e intuitiva, encontra-se completamente em nosso idioma, o que facilita a criação de projetos aos usuários inexperientes.

É uma ferramenta para profissionais que gostam de estudar, pois seus códigos fonte são de fácil assimilação, servindo perfeitamente como ponte para futuros desenvolvimentos no próprio .NET. Isto é possível graças ao amplo suporte de formatos para o qual foi projetado: C#, VB.NET, Python, Ruby, Boo, C++, F# e ASP.NET MVC.

Dentre as características do SharpDevelop você pode contar com a conversão de linguagens (VB.NET para C# e vice-versa) oq ue pode te ajudar muito se você precisar migrar um projeto VB .NET para C# ou vice-versa.

Neste artigo eu resolvi criar uma aplicação WPF acessando o banco de dados MySQL.

Para acompanhar o artigo você deverá ter noções sobre WPF e MySQL e se esses assuntos são novos para você sugiro que leia os meus artigos nas referências.

A seguir a relação do que você precisa instalar para poder seguir este artigo passo a passo:

Definindo o Banco de dados no MySQL

Eu não vou mostrar todo o processo de criar um banco de dados e tabelas no MySQL (veja as referências sobre o assunto).

Usando o MySQL Administrator podemos ver na figura abaixo o banco de dados Cadastro e a tabela Clientes que serão usados no artigo:

Usando o MySQL Query Browser podemos ver os dados da tabela Clientes usando uma consulta MySQL conforme abaixo:

Podemos acessar o banco de dados Cadastro usando a seguinte string de conexão:

strcon = "server=127.0.0.1;uid=root;pwd=******;database=cadastro;"

Criando o projeto no SharpDevelop 4.0

Abra o SharpDevelop e no menu File selecione New -> Project;

Na janela New Project selecione o item C# -> WPF e a seguir o template WPF Application e informe o nome DataBinding_ShpDev e clique em Create;

Será criado o projeto conforme a figura abaixo, onde podemos ver as abas que permitem visualizar o código XAML e o Descritor WPF bem como a janela de Propriedades e as classes do projeto;

Vamos incluir uma referência ao assembly do MySQL.Data.dll.

Clique com o botão direito do mouse sobre o item References;

Na janela Add Reference selecione a guia - .NET Assembly Browser - e a seguir clique no botão Browse;

Em seguida selecione a pasta onde esta instalado o Connector do MySQL e selecione o assembly MySQL.Data.dll e clique em Abrir;

Pronto agora já temos as classes para acesso a dados para o MySQL da ADO .NET.

Vamos iniciar definindo o código que irá acessar o banco de dados Cadastro e a tabela Clientes no arquivo Window1.xaml.cs conforme abaixo:

O código acima extrai os dados do banco de dados Cadastro e preenche um DataTable usando a string de conexão e código ADO .NET.

Agora note a propriedade DataContext  a qual atribuímos a nossa fonte de dados,no caso o DataTable dt.

DataContext é uma propriedade existente em qualquer FrameWorkElement e que permite que os controles herdem, de seu parent, a fonte de dados.

Um DataContext pode ser ligado diretamente a um objeto CLR ou a um DataSource Provider. No nosso exemplo temos uma Window e esse Window possui alguns TextBox inseridos nele. Ao se definir que o DataContext do Window é por exemplo o DataTable , não é mais necessário indicar o DataContext dos demais TextBox. Eles, por estarem dentro da hierarquia do Window, entendem que devem herdar o DataContext de Window, caso outro não seja especificado.

Existem muitas formas de especificar a sua fonte de vinculação de dados, ou seja, definir qual a origem dos seus dados.
A forma mais simples é instanciar o objeto origem como um recurso XAML e então definir a propriedade Source da vinculação para o recurso.
Usar a propriedade Source  é a forma mais simples. Porém, se múltiplas propriedades estão vinculadas a mesma origem, considera utilizar a propriedade DataContext.
A propriedade DataContext fornece uma forma conveniente de estabelecer um escopo de dados quando você tem muitos controles e você quer vincular todos a mesma origem

Vamos abrir o arquivo Window1.xml e definir uma interface bem simples onde iremos usar apenas os controles Label e TextBox conforme o leiaute abaixo:

?xml version="1.0" encoding="utf-8"?>
<Window
	x:Class="DataBinding_ShpDev.Window1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
	Title="DataBinding - MySQL e SharpDevelop 4"
	Background="#FFB9D1EA"
	Width="421"
	Height="219">
	<Grid>
		<Panel.Background>
			<RadialGradientBrush />
		</Panel.Background>
		<Grid.RowDefinitions>
			<RowDefinition />
			<RowDefinition />
			<RowDefinition />
			<RowDefinition />
			<RowDefinition />
			<RowDefinition />
		</Grid.RowDefinitions>
		<Grid.ColumnDefinitions>
			<ColumnDefinition
				Width="75" />
			<ColumnDefinition />
		</Grid.ColumnDefinitions>
		<Label>Id:</Label>
		<TextBox
			Text="{Binding Path=id}"
			Grid.Column="1" />
		<Label
			Grid.Row="1">Nome:</Label>
		<TextBox
			Grid.Row="1"
			Text="{Binding nome}"
			Grid.Column="1" />
		<Label
			Grid.Row="2">Email:</Label>
		<TextBox
			Grid.Row="2"
			Text="{Binding email}"
			Grid.Column="1" />
		<Label
			Grid.Row="3">Cidade:</Label>
		<TextBox
			Grid.Row="3"
			Text="{Binding cidade}"
			Grid.Column="1" />
		<Label
			Grid.Row="4">Idade:</Label>
		<TextBox
			Text="{Binding idade}"
			Grid.Row="4"
			HorizontalAlignment="Stretch"
			VerticalAlignment="Stretch"
			Margin="0,3.33332650370721E-09,0,0"
			Height="44.666666663333345"
			Grid.Column="1" />
	</Grid>
</Window>

O código a acima no arquivo Window1.xaml é usado para mostrar o DataBinding no WPF, onde temos que cada binding possui 4 componentes:

-
um objeto de destino (target object)
- uma propriedade de destino (a propriedade Text do TextBox)
- uma fonte de vinculação (binging source)
- um caminho para o valor na fonte de ligação (Neste artigo o valor da propriedade Path é o nome do objeto de origem a ser usado na ligação.

Agora temos que permitir a navegação pelos dados. (Lembra do BindingNavigator ? )

No WPF podemos fazer a mesma coisa usando a classe CollectionView.

A classe CollectionView representa uma visão para agrupamento, ordenação, filtragem e navegação de uma coleção de dados.

Para criar uma visão para uma coleção que implementa IEnumeralbe, crie um objeto CollectionViewSource, inclua na sua coleção a propriedade Source e obtenha a visão da coleção através da propriedade View.

Você pode pensar na CollectionView como uma camada na parte superior de uma vinculação de origem que permite que você navegue e exiba a coleção com base na classificação, filtro e agrupamento de consultas, tudo sem precisar manipular a coleção de origem subjacentes.

Se a coleção de origem implementa a interface INotifyCollectionChanged, as alterações que disparam o evento
CollectionChanged são propagadas para os visões. 
 

Nas aplicações WPF todas as coleções tem uma visão de coleção padrão associada. Em vez trabalhar diretamente com a coleção, o mecanismo de ligação sempre acessa a coleção através de exibição associada. Para obter o modo de exibição padrão use o método CollectionViewSource.GetDefaultView.

Vamos então implementar esta funcionalidade em nosso código:

Primeiro vamos incluir dois controles Button a partir da ToolBox no Descritor XAML:

Após isso vamos abrir o arquivo Window1.xaml.cs e definir o código no evento Click de cada Botão para permitir a navegação:

Abaixo vemos as novas linhas de código que foram incluídas destacas em azul:

using System;
using System.Collections.Generic;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Data;
using MySql.Data.MySqlClient;

namespace DataBinding_ShpDev
{
	/// <summary>
	/// Interaction logic for Window1.xaml
	/// </summary>
	public partial class Window1 : Window
	{
		CollectionView visao;
    		DataTable dt = new DataTable();
			
	public Window1()
	{
	      InitializeComponent();
		
	      DataTable dt = new DataTable();

               //Define a string de conexão
               String connString = "server=127.0.0.1;uid=root;pwd=gpxpst;database=cadastro;";
                
              //Define a consulta
              String query = "select id, nome, email, cidade, idade from clientes";

               // Preenche o datatabela com os dados
              using (MySqlConnection conn = new MySqlConnection(connString))
              {
                //passa a consulta e a connection String e cria o adapter
                MySqlDataAdapter da = new MySqlDataAdapter(query, conn);
                da.Fill(dt);
              }

             // define o DataCOntext
              DataContext = dt;  
              visao = (CollectionView)CollectionViewSource.GetDefaultView(dt);
            }
		
	void button1_Click(object sender, RoutedEventArgs e)
	{
		visao.MoveCurrentToPrevious();
	}
		
	void button2_Click(object sender, RoutedEventArgs e)
	{
		visao.MoveCurrentToNext();
	}
    }
}

Executando o projeto teremos a janela WPF exibindo os dados da tabela Clientes do MySQL e permitindo a navegação conforme a figura a seguir:

Assim temos a utilização de ferramentas totalmente gratuitas como o SharpDevelop e MySQL permitindo a criação de uma aplicação WPF.

Antes de encerrar vou mostrar a característica de conversão entre as linguagens VB .NET e C# do SharpDevelop.

Abra o arquivo Window1.xaml.cs e vamos converter o código para VB .NET...

Selecione no menu Project a opção Convert e selecione a From C# to VB .NET:

Será criado um projeto com o mesmo nome do original acrescido de .Converted, onde poderemos espiar o código convertido para VB .NET:

E voilá, eis o nosso código C# convertido para VB .NET.

Simples , simples assim...

Pegue o projeto completo aqui: DataBinding_ShpDev.zip

Eu sei é apenas SharpDevelop e MySQL e WPF, mas eu gosto...

Referências:

José Carlos Macoratti