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: