Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

RSS iMasters

[Resolvido] Como realizar as operações CRUD em uma aplicação WPF

Recommended Posts

Neste artigo eu voumostrar como realizar as operações CRUD em uma aplicação WPFcom DataGrid usando o Linq to SQL.

Abra o Visual Basic 2010Express Edition e crieuma nova aplicação WPF com o nome: Wpf_DataGrid_Crud.

40365.gif

Definindo a fonte de dados

Como fonte de dados, eu estou usandoum banco de dados SQL Server criado no SQL Server Management Studio com o nome Cadastro.mdfe a tabela Alunos que possui os campos: Id,Nome , Idade e Email.

Abaixo podemos ver na figura o bancode dados, a tabela e seus campos e alguns dados que eu jáincluí na tabela.

40371.gif

Para acessar e realizar asoperações CRUD, eu poderia usar umDataSet, o NHibernate, o Entity Framework, mas nesteartigo eu vou usar o Linq to SQL para mostrarque, embora ofuscado pelo Entity Framework, ele ainda pode ser usado para operaçõessimples como a deste artigo.

Quando pensamos em acesso a dados naplataforma .NET, pensamos em ADO .NET, certo?

Pois bem, como fazemos atualmentepara acessar os dados em um banco relacional com ADO .NET? Geralmente efetuamos arepresentação das tabelas do banco de dados em classes de formaa criar uma interface para persistência das informações.

Isso é feito hoje basicamente deduas formas:

  1. Fazer o mapeamento objeto-relacional usando DataSets e o acesso a dados através de DataAdapters ou TableAdapters com ajuda dos Assistentes de configuração

  2. Fazer o mapeamento objeto-relacional através da criação das classes de negócio via código e acessando os dados usando DataReader

O LINQ To SQL tem o objetivode reunir o melhor das duas opções, de forma que você possafazer o mapeamento objeto-relacional criando classes querepresentam as tabelas do banco de dados, inclusive mapeandostored procedures como métodos e, com isso, possibilitando acriação de consultas e as alterações no banco de dados usando asintaxe LINQ. Na verdade, as consultas criadas na 'linguagem' LINQ são convertidas em código T-SQL, sendo retornada uma coleção de objetos.

Agora vamos incluir a partir do menuProject->Add New Item e a partir da janela Templateso item LINQ to SQL Classes, alterando o nome paraCadastro.dbml e clicando no botão Add.

40369.gif

Neste momento, será exibida a janelado descritor Objeto Relacional. Expanda os objetos dobanco de dados Cadastro.mdf e selecione a tabela 'Alunos'. Arraste-a e solte-a na janela do descrito ORM.

A tabela do banco de dados serámapeada como uma classe (campos como propriedades, procedures efunções como métodos) e você terá no Descritor a classe 'Aluno', que representa atabela 'Alunos' do banco de dados.

40373.gif

O arquivo Cadastro.dbmlcontém o arquivo XML com informações sobre o leiaute da tabelaque foi mapeada e também o descritor contendo a classe geradapelo mapeamento. Após encerrar o mapeamento, você já teráacesso aos recursos do LINQ To SQL com direito a intellisense completo das informações referentes àtabela, mesmo sem conhecer nada sobre ela. Se você abrir a janelade propriedades, verá que o arquivo cadastro.dbml seráidentificado pelo nome CadastroDataContexte representando o nosso contexto de acesso às classes.

Nota: Você devedefinir a chave primária na tabela 'Aluno' para que as operaçõessejam processadas sem erros.

Definindoa interface

Vamos agora criar noarquivo MainWindow.xaml a interface da nossaaplicação que irá exibir os dados da tabela 'Alunos'. Para isso,vou usar um controle DataGrid definido conformeo leiaute da figura abaixo:

40375.gif

O código XAML usado paradefinir o leiaute acima pode ser visto abaixo:

<Window x:Class="MainWindow"

xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

Title="WPF - DataGrid - CRUD com LINQ To SQL" Height="350" Width="525">

<Grid>

<Grid.RowDefinitions>

<RowDefinition Height="0.912*"/>

<RowDefinition Height="0.088*"/>

</Grid.RowDefinitions>

<DataGrid x:Name="dgData" Margin="0" AutoGenerateColumns="False"

RowEditEnding="dgData_RowEditEnding"

CommandManager.PreviewExecuted="dgData_PreviewExecuted"

CanUserAddRows="True" CanUserDeleteRows="True">

<DataGrid.Columns>

<DataGridTextColumn Binding="{Binding Id}" Header="ID" IsReadOnly="True"/>

<DataGridTextColumn Binding="{Binding Nome}" Header="Nome" Width="150"/>

<DataGridTextColumn Binding="{Binding Idade}" Header="Idade"/>

<DataGridTextColumn Binding="{Binding Email}" Header="Email" Width="*"/>

</DataGrid.Columns>

</DataGrid>

<TextBlock x:Name="txtStatus" HorizontalAlignment="Left" Margin="8,0,0,0" Grid.Row="1"

TextWrapping="Wrap" VerticalAlignment="Center"/>

</Grid>

</Window>

Agora abra o arquivo MainWindow.xaml.vbe inclua o seguinte código no evento Loaded dajanela Window:

Private Sub MainWindow_Loaded(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles Me.Loaded

 

Dim ctx As New CadastroDataContext

Dim result = From emp In ctx.Alunos

If result.ToList().Count > 0 Then

txtStatus.Text = "Operação de leitura do arquivo."

End If

 

dgData.ItemsSource = result.ToList()

 

End Sub

Se você executar o código agora (não se esqueçade definir os eventos: dgData_PreviewExecuted edgData_RowEditEnding),deverá obter o seguinte resultado:

40376.gif

Agora, no evento dgData_RowEditEnding, vamosincluir o código para realizar a inclusão e a atualização dosdados conforme abaixo:

Private Sub dgData_RowEditEnding(ByVal sender As System.Object, ByVal e As System.Windows.Controls.DataGridRowEditEndingEventArgs)

If e.EditAction = DataGridEditAction.Commit Then

Dim contexto As New CadastroDataContext()

Dim _aluno As Aluno = TryCast(e.Row.DataContext, Aluno)

Dim dadosEncontrados = (From em In contexto.GetTable(Of Aluno)() Where em.Id = _aluno.Id).SingleOrDefault()

If dadosEncontrados Is Nothing Then

Dim tabela = contexto.GetTable(Of Aluno)()

Dim _aluno1 As New Aluno()

_aluno1.Nome = _aluno.Nome

_aluno1.Idade = _aluno.Idade

_aluno1.Email = _aluno.Email

tabela.InsertOnSubmit(_aluno1)

tabela.Context.SubmitChanges()

txtStatus.Text = "Dados Inseridos."

Else

dadosEncontrados.Nome = _aluno.Nome

dadosEncontrados.Idade = _aluno.Idade

dadosEncontrados.Email = _aluno.Email

contexto.SubmitChanges()

txtStatus.Text = "Dados atualizados"

End If

End If

 

End Sub

Para excluir um registro,vamos usar o evento dgData_PreviewExecuted,incluindo nele o código abaixo:

Private Sub dgData_PreviewExecuted(ByVal sender As System.Object, ByVal e As System.Windows.Input.ExecutedRoutedEventArgs)

 

Dim _aluno As Aluno = TryCast(dgData.SelectedItem, Aluno)

 

If _aluno IsNot Nothing Then

Dim alunoEncontrado = (From em In contexto.GetTable(Of Aluno)() Where em.Id = _aluno.Id).SingleOrDefault()

If e.Command.Equals(DataGrid.DeleteCommand) Then

If Not (MessageBox.Show("Deseja excluir este registro ?", "Confirma Exclusão !", MessageBoxButton.YesNo) = MessageBoxResult.Yes) Then

e.Handled = True

Else

contexto.Alunos.DeleteOnSubmit(alunoEncontrado)

contexto.SubmitChanges()

txtStatus.Text = "O registro foi excluído."

End If

End If

End If

 

End Sub

Executando o projeto, iremosobter:

40377.gif

Atualizando dados

40378.gif

Incluindo um aluno novo

40379.gif

Excluindo um aluno

Assim, pudemos conferir autilização do LINQ to SQL em uma aplicação WPF para realizaras operações CRUD em um banco de dados SQL Server. O EntityFramework seria uma escolha mais adequada pelos recursosdisponíveis e por poder ser usado com qualquer banco de dados.

Pegue o projeto completoaqui:  Wpf_DataGrid_Crud.ziphttp://www.macoratti.net/11/07/Wpf_DataGrid_Crud.zip'>

 

http://imasters.com.br/artigo/21979/dotnet/como-realizar-as-operacoes-crud-em-uma-aplicacao-wpf-com-datagrid-usando-o-linq-to-sql

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.