WPF- Usando o DataGrid e o SQL Server Compact
O WPF é uma evolução do Windows Forms trazendo novos recursos e possibilidades sendo que o seu maior apelo é a interface com o usuário.
Neste artigo vamos criar uma aplicação WPF, acessar uma base de dados SQL Server Compact e exibir os registros em um controle DataGrid da WPF. Tudo muito simples.
Você vai precisar dos seguintes recursos:
Criando o projeto e definindo a interface
Abra o Visual C# 2010 Express Edition e no menu File clique em New Project e selecione WPF Application informando o nome CadastroWPF_SQLServer;
Selecione o arquivo MainWindow.xaml na janela Solution Explorer conforme mostra a figura abaixo e altere o texto em Title para "Cadastro de Clientes";
A seguir vamos definir uma interface bem simples e para isso vamos usar os seguintes controles a partir da ToolBox:
O leiaute e o código XAML usado são mostrados a seguir:
código XAML :
<Window x:Class="CadastroWPF_SQLServer.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="Cadastro de Clientes" Height="480" Width="530" Background="#3200EE51"> <Grid> <Grid.RowDefinitions> <RowDefinition Height="41" /> <RowDefinition Height="41" /> <RowDefinition Height="41" /> <RowDefinition Height="41" /> <RowDefinition Height="231*" /> </Grid.RowDefinitions> <Label Content="Nome" Height="28" HorizontalAlignment="Left" Margin="12,9,0,0" Name="lblNome" VerticalAlignment="Top" Width="96" /> <TextBox Height="23" HorizontalAlignment="Left" Margin="139,12,0,0" Name="txtNome" VerticalAlignment="Top" Width="187" Visibility="Visible" IsEnabled="True" /> <Label Content="Endereço" Grid.Row="1" Height="28" HorizontalAlignment="Left" Margin="13,6,0,0" Name="lblEndereco" VerticalAlignment="Top" Width="66" /> <TextBox Grid.Row="1" Height="23" HorizontalAlignment="Right" Margin="0,9,182,0" Name="txtEndereco" VerticalAlignment="Top" Width="187" /> <Label Content="Nascimento" Grid.Row="2" Height="28" HorizontalAlignment="Left" Margin="14,8,0,0" Name="lblNascimento" VerticalAlignment="Top" Width="94" /> <DatePicker Grid.Row="2" Height="25" HorizontalAlignment="Left" Margin="139,10,0,0" Name="dtpNascimento" VerticalAlignment="Top" Width="187" /> <Label Content="Cidade" Grid.Row="3" Height="28" HorizontalAlignment="Left" Margin="14,8,0,0" Name="lblCidade" VerticalAlignment="Top" Width="94" /> <ComboBox Grid.Row="3" Height="23" HorizontalAlignment="Left" Margin="138,9,0,0" Name="cboCidade" VerticalAlignment="Top" Width="188" Background="White"> <ComboBoxItem Name="saopaulo" Content="São Paulo"/> <ComboBoxItem Name="riodejaneiro" Content="Rio de Janeiro" /> <ComboBoxItem Name="minasgerais" Content="Minas Gerais" /> </ComboBox> <Button Content="Incluir" Grid.Row="4" Height="23" HorizontalAlignment="Left" Margin="138,13,0,0" Name="btnIncluir" VerticalAlignment="Top" Width="70" Click="btnIncluir_Click" /> <DataGrid AutoGenerateColumns="False" Grid.Row="4" Height="199" HorizontalAlignment="Left" Margin="14,65,0,0" Name="dtgClientes" VerticalAlignment="Top" Width="481" ItemsSource="{Binding Path=ClientesDataBinding}" Loaded="dtgClientes_Loaded" CanUserResizeRows="False" SelectedCellsChanged="dtgClientes_SelectedCellsChanged"> <DataGrid.Columns>0 <DataGridTextColumn Binding="{Binding Path=Nome}" Header="Nome" Width="120" IsReadOnly="True" /> <DataGridTextColumn Binding="{Binding Path=Endereco}" Header="Endereço" Width="110" IsReadOnly="True" /> <DataGridTextColumn Binding="{Binding Path=Nascimento}" Header="Nascimento" Width="150" IsReadOnly="True" /> <DataGridTextColumn Binding="{Binding Path=Cidade}" Header="Cidade" Width="90" IsReadOnly="True" /> </DataGrid.Columns> </DataGrid> <Button Content="Deletar" Grid.Row="4" Height="23" HorizontalAlignment="Left" Margin="226,13,0,0" Name="btnDeletar" VerticalAlignment="Top" Width="82" Click="btnDeletar_Click" /> <Button Content="Atualizar" Grid.Row="4" Height="23" HorizontalAlignment="Left" Margin="328,13,0,0" Name="bntAtualizar" VerticalAlignment="Top" Width="75" Click="bntAtualizar_Click" /> <Button Content="Novo" Grid.Row="4" Height="23" HorizontalAlignment="Left" Margin="48,14,0,0" Name="btnNovo" VerticalAlignment="Top" Width="76" Click="btnNovo_Click" /> </Grid> </Window> |
Estamos usando o controle DataGrid e fazendo a vinculação dos dados através da propriedade ItemsSource definindo a propriedade Path;
Definimos também a propriedade CanUserReziseRows como False e estamos tratando os eventos : Loaded e SelectedCellsChanged;
<DataGrid
AutoGenerateColumns="False"
Grid.Row="4" Height="199"
HorizontalAlignment="Left"
Margin="14,65,0,0" Name="dtgClientes"
VerticalAlignment="Top" Width="481" ItemsSource="{Binding Path=ClientesDataBinding}" Loaded="dtgClientes_Loaded" CanUserResizeRows="False" SelectedCellsChanged="dtgClientes_SelectedCellsChanged"> <DataGrid.Columns>0 <DataGridTextColumn Binding="{Binding Path=Nome}" Header="Nome" Width="120" IsReadOnly="True" /> <DataGridTextColumn Binding="{Binding Path=Endereco}" Header="Endereço" Width="110" IsReadOnly="True" /> <DataGridTextColumn Binding="{Binding Path=Nascimento}" Header="Nascimento" Width="150" IsReadOnly="True" /> <DataGridTextColumn Binding="{Binding Path=Cidade}" Header="Cidade" Width="90" IsReadOnly="True" /> </DataGrid.Columns> </DataGrid> |
Criando o banco de dados e a tabela Clientes e definindo a string de conexão
Vamos agora criar o banco de dados e a tabela Clientes no SQL Server Compact;
Abra a janela DataBase Explorer (View->Other Windows->DataBase Explorer) e clique com o botão direito do mouse sobre Data Connections e a seguir em Add Connection:
A seguir selecione o item Microsoft SQL Server Compact 3.5 e clique no botão Continue:
Na janela Add Connection aceite as configurações padrão, Informe o nome Cadastro e Clique no botão Create;
Na próxima janela clique no botão OK e após isso confirme a criação do banco de dados:
Ao final clique no botão Test Connection e verifique se a conexão esta OK:
Volte a janela DataBase Explorer e expanda os objetos do banco de dados Cadastro.sdf que acabamos de criar;
Clique com o botão direito do mouse sobre Tables e selecione Create Table;
A seguir na janela New Table define a tabela com o nome Clientes e os seguintes campos:
Na janela DataBase Explorer veremos a tabela e sua estrutura exibida.
Clique com o botão direito do mouse sobre a tabela e selecione Show Table Data e preencha o primeiro registro com dados válidos conforme abaixo:
Se observarmos a janela de propriedades do banco de dados veremos a propriedade Connection String definida, no meu caso com o valor: Data Source=C:\Users\f5361091\Documents\Cadastro.sdf
Vamos incluir no projeto um arquivo de configuração App.Config e definir neste arquivo a string de conexão com o banco de dados.
No menu Project clique em Add New Item e a seguir selecione o template Application Configuration File informando o nome App.Config e clicando no botão Add;
Agora inclua a definição da string de conexão com banco de dados no arquivo App.Config conforme mostra a figura a seguir:
Definindo o código do projeto
Vamos agora definir o código que vai fazer as coisas funcionarem no arquivo code-behind MaindWindow.xaml.cs:
Antes vamos ter que incluir uma referência ao namespace System.Configuration no projeto.
No menu Project clique em Add Reference e a seguir selecione a guia .NET e o item System.Configuration e clique em OK;
Agora podemos definir o namespace using System.Configuration no arquivo MaindWindow.xaml.cs.
Agora temos que incluir mais uma referência no projeto para podermos acessar o banco de dados SQL Server Compact:
1- No menu Project clique
em Add Reference;
2 - Selecione Browse;
3 - localize o caminho C:\Arquivos de Programa (x86)\Microsoft SQL Server
Compact Edition\v3.5\Desktop
4 - selecione System.Data.SqlServerCe.dll;
5- Confirme e clique em OK;
Agora podemos definir os namespaces que iremos usar no projeto:
using System;
using System.Windows;
using System.Configuration;
using System.Data.SqlServerCe;
using System.Data;
Vamos iniciar obtendo a string de conexão do arquivo App.Config e em definindo um método para abria a conexão com o banco de dados, selecionar o dados da tabela Clientes e exibir no controle DataGrid e fechar a conexão:
using System.Windows; using System.Configuration; using System.Data.SqlServerCe; using System.Data; namespace CadastroWPF_SQLServer { public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); } // Obtendo a string de conexão do arquivo App.Config string _strinConexao = ConfigurationManager.ConnectionStrings["ClientesSDF"].ConnectionString; public void VinculaDados() { SqlCeConnection _Conn = new SqlCeConnection(_strinConexao); // Abre a conexão _Conn.Open(); SqlCeDataAdapter _Adapter = new SqlCeDataAdapter("Select * from Clientes", _Conn); DataSet _ds = new DataSet(); _Adapter.Fill(_ds, "ClientesDataBinding"); dtgClientes.DataContext = _ds; // Fecha a conexão _Conn.Close(); } } } |
Agora vamos definir o código dos eventos dos controles.
Vamos iniciar com o evento Loaded o controle DataGrid e neste evento chamar o método VinculaDados():
private void dtgClientes_Loaded(object sender, RoutedEventArgs e) { try { this.VinculaDados(); } catch (Exception ex) { MessageBox.Show(ex.ToString()); } } |
Este código irá preencher e exibir os dados no controle DataGrid.
No evento SelectedCellsChanged do controle DataGrid vamos colocar o código de forma que ao selecionar uma linha o DataGrid os dados seja exibidos nos controles TextBox.
private void dtgClientes_SelectedCellsChanged(object sender, System.Windows.Controls.SelectedCellsChangedEventArgs e) { try { DataRowView _dv = dtgClientes.CurrentCell.Item as DataRowView; if (_dv != null) { txtCodigo.Text = string.Empty; txtNome.Text = _dv.Row[0].ToString(); txtNome.IsEnabled = false; txtEndereco.Text = _dv.Row[1].ToString(); dtpNascimento.Text = _dv.Row[2].ToString(); cboCidade.Text = _dv.Row[3].ToString(); } } catch (Exception ex) { MessageBox.Show(ex.ToString()); } } |
A próxima etapa é definir o código do evento Click de cada um dos botões de comando:
1- Botão - Novo - Limpa as caixas de texto
private void btnNovo_Click(object sender, RoutedEventArgs e) { txtNome.Text = string.Empty; if (txtNome.IsEnabled != true) { txtNome.IsEnabled = true; } txtEndereco.Text = string.Empty; dtpNascimento.Text = string.Empty; cboCidade.Text = string.Empty; } |
2- Botão Incluir - Incluir um novo registro na tabela Clientes usando a instrução SQL - Insert Into;
private void btnIncluir_Click(object sender, RoutedEventArgs e) { try { SqlCeConnection _Conn = new SqlCeConnection(_strinConexao); // abre a conexao _Conn.Open(); string _Data = dtpNascimento.DisplayDate.ToShortDateString(); // comando SQL para inserir - Insert Into string _Inserir = @"insert into Clientes (Nome,Endereco,Nascimento,Cidade) Values('" + txtNome.Text + "','" + txtEndereco.Text + "','" + _Data.ToString() + "','" + cboCidade.Text + "')"; // inicializa o comando e a conexão SqlCeCommand _cmd = new SqlCeCommand(_Inserir, _Conn); // executa o comando _cmd.ExecuteNonQuery(); MessageBox.Show("Registro incluído !"); txtCodigo.Text = string.Empty; txtNome.Text = string.Empty; txtEndereco.Text = string.Empty; dtpNascimento.Text = string.Empty; cboCidade.Text = string.Empty; this.VinculaDados(); } catch (Exception ex) { MessageBox.Show(ex.ToString()); } } |
3- Botão Atualizar - Atualiza um registro usando a instrução SQL - Update
private void bntAtualizar_Click(object sender, RoutedEventArgs e) { try { SqlCeConnection _Conn = new SqlCeConnection(_strinConexao); // abre a conexao _Conn.Open(); string _Data = dtpNascimento.DisplayDate.ToShortDateString(); // comando SQL para inserir - Insert Into string _Atualizar = @"Update Clientes Set Nome = '" + txtNome.Text + "', Endereco = '" + txtEndereco.Text + "',Nascimento = '" + _Data.ToString() + "',Cidade = '" _ + cboCidade.Text + "' where Codigo = " + Convert.ToInt32(txtCodigo.Text); // inicializa o comando e a conexão SqlCeCommand _cmdAtualizar = new SqlCeCommand(_Atualizar, _Conn); // executa o comando _cmdAtualizar.ExecuteNonQuery(); MessageBox.Show("Registro atualizado !"); txtCodigo.Text = string.Empty; txtNome.Text = string.Empty; txtEndereco.Text = string.Empty; dtpNascimento.Text = string.Empty; cboCidade.Text = string.Empty; this.VinculaDados(); } catch (Exception ex) { MessageBox.Show(ex.ToString()); } } |
4- Botão Deletar - Exclui um registro da tabela Clientes usando a instrução SQL - Delete;
private void btnDeletar_Click(object sender, RoutedEventArgs e) { try { SqlCeConnection _Conn = new SqlCeConnection(_strinConexao); // Open Database Connection _Conn.Open(); // Command String string _Deletar = @"Delete from Clientes Where codigo = " + Convert.ToInt32(txtCodigo.Text); // inicializa o comando e a conexão SqlCeCommand _cmdDeletar = new SqlCeCommand(_Deletar, _Conn); // executa o comando _cmdDeletar.ExecuteNonQuery(); MessageBox.Show("Registro deletado !"); txtNome.Text = string.Empty; txtEndereco.Text = string.Empty; dtpNascimento.Text = string.Empty; cboCidade.Text = string.Empty; this.VinculaDados(); } catch (Exception ex) { MessageBox.Show(ex.ToString()); } } |
Executando o projeto iremos obter:
Pegue o projeto completo aqui: CadastroWPF_SQLServer.zip
Rom 13:8
A ninguém devais coisa alguma, senão o amor recíproco; pois quem ama ao próximo tem cumprido a lei.Referências: