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:

  1. Visual C# 2010 Express Edition ou Visual Studio 2010
  2. SQL Server Compact Edition

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:

  1. Codigo - int - Primary Key , identity
  2. Nome - nvarchar(50)
  3. Endereco - nvarchar(100)
  4. Nascimento - datetime
  5. Cidade - nvarchar(50)

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.
Rom 13:9
Com efeito: Não adulterarás; não matarás; não furtarás; não cobiçarás; e se há algum outro mandamento, tudo nesta palavra se resume: Amarás ao teu próximo como a ti mesmo.
Rom 13:10
O amor não faz mal ao próximo. De modo que o amor é o cumprimento da lei.

Referências:


José Carlos Macoratti