WPF - Usando a vinculação de dados, conceitos e prática II


Na primeira parte deste artigo eu criei uma aplicação WPF usando o VS 2008 com acesso a dados mostrando como usar os alguns controles do WPF e efetuar o databinding. Parei na navegação pelos registros onde usei a classe CollectionView. Neste artigo eu vou mostrar como realizar a operações CRUD (Create,Read,Update, Delete) na aplicação WPF. Veja abaixo o resultado final obtido com nossa aplicação na primeira parte do artigo.

O que temos que fazer agora é mostrar como efetuar as operações para  incluir , excluir , cancelar e salvar os registros da tabela Categories no banco de dados.

Vamos começar com a inclusão de um novo registro na tabela. Para isso inclua o seguinte código no evento Click do botão Novo:

Private Sub btnNovo_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles btnNovo.Click

Dim linha = Me.categoriaDados.Categories.NewCategoriesRow

linha.CategoryName = "[Novo]"
Me.categoriaDados.Categories.AddCategoriesRow(linha)
Me.view.MoveCurrentToLast()

End Sub

Aqui não há segredo algum, Estamos incluindo um novo registro no dataset tipado usando a instância da classe CategoriesRow e atribuindo uma nova linha para em seguida preencher com os dados que virão formulário e no final incluímos a linha na coleção de linhas. Estamos movendo o ponteiro para o último registro que será a linha incluída.

Para excluir um registro temos o seguinte código no evento Click do botão Excluir:

Private Sub btnExcluir_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles btnExcluir.Click
 

If Me.view.CurrentPosition > -1 Then

     If MessageBox.Show("Vocˆ deseja excluir estas informa‡“es ? ", Me.Title, MessageBoxButton.YesNo) = MessageBoxResult.Yes Then

                 Dim linha = CType(Me.view.CurrentItem, System.Data.DataRowView).Row

             linha.Delete()

             MsgBox("Os dados foram exclu¡dos.")

       End If

End If

End Sub

Neste código verificamos se a linha a ser excluída é uma linha válida  e exibimos uma mensagem para confirmação do usuário.

Em seguida fazemos uma coerção forçada (cast) da linha atual (view.CurrentItem) para System.Data.DataRowView e em seguida usamos o método Delete para excluir a linha.

Vejamos agora o código para cancelar uma operação que será incluído no evento Click do botão Cancelar:

Private Sub btnCancelar_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles btnCancelar.Click


If Me.categoriaDados.HasChanges Then

    If MessageBox.Show("Vocˆ deseja cancelar as altera‡äes feitas ? ", Me.Title, MessageBoxButton.YesNo) = MessageBoxResult.Yes Then

          Me.categoriaDados.RejectChanges()

   End If

End If

End Sub

Primeiro verificamos se ocorreu uma alteração no DataSet usando o método HasChanges,  este método retorna um valor indicando se o DataSet sofreu alteração pela inclusão ,  exclusão ou modificação das linhas.

Em caso positivo usamos o método RejectChanges() do DataSet tipado que desfaz as mudanças feitas no dataset desde que ele foi criado ou deste a última vez que o método AcceptChanges foi chamado.

Para concluir temos o código para salvar os dados incluído no evento Click do botão Salvar:

Private Sub btnSalvar_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles btnSalvar.Click

Try

   If Me.categoriaDados.HasChanges Then

            If Me.taManager.UpdateAll(Me.categoriaDados) > 0 Then

              MsgBox("Dados salvos com sucesso !")

            End If

    End If

Catch ex As Exception

     MsgBox(ex.ToString)

End Try

End Sub

Aqui novamente verificamos se houve alteração no dataset checando o método HasChanges para em seguida usar o método UpdateAll do  TableAdapterManager.

O TableAdapterManager é um novo componente presente no VS 2008 que atua sobre datasets tipados e TableAdapters e permite a atualização de dados em tabelas relacionadas(Atualização hierárquica) de uma forma mais fácil. Na versão anterior era necessário a inclusão de código para realizar esta tarefa corretamente.

A atualização hierárquica é o processo de atualização dos dados modificados em tabelas relacionadas em um dataset tipado pela utilização do novo componente TableAdapterManager.

O TableAdapterManager usa o relacionamento da chave primária entre as tabelas para determinar corretamente a ordem na qual deve enviar os Inserts, Updates e Deletes do DataSet para o banco de dados sem violar as restrições da chave-primária (integridade referencial) no banco de dados.

O TableAdapterManager  facilita a atualização de múltiplas tabelas e reduz o trabalho usando o método UpdateAll.

Salvar dados de tabelas relacionados é uma tarefa mais complexa pois os comandos para inclusão, atualização e exclusão para cada tabela relacionada tem que ser executadas em um ordem específica para evitar a violação na integridade referencial definida no banco de dados.

A classe TableAdapterManager é gerada quando você cria um dataset tipado em um projeto. Na verdade é a propriedade Hierarchical Update do dataset que determina se um TableAdpaterManager será criado ou não. Se o valor da propriedade for definido como True ele será criado e o código para atualizar atualização hierárquica em tabelas relacionadas é gerado também.

Para encerrar quero chamar a sua atenção para a declaração dos eventos Click nos botões de comando da nossa aplicação. Todos eles tem seguinte sintaxe:

(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) -> WPF

Se você comparar com o mesmo evento de um botão de uma aplicação Windows Forms verá que a sintaxe é :

(ByVal sender As System.Object, ByVal e As System.EventArgs) -> WIndows Forms

A diferença fica por conta da classe RoutedEventArgs que  contém informações do estado e dados de evento associados com um evento roteado, e  é especifica do WPF.

Com isso encerramos a nossa aplicação WPF agora com todos os recursos prontos: a navegação e as operações CRUD.

Executando o projeto e realizando uma operação de incluir um novo registro , clicando no botão Novo informando os dados e clicando no botão Salvar, teremos o resultado abaixo:

Pegue o projeto completo aqui : wpf_Dados.zip

Eu sei é apenas WPF mas eu gosto...

Referencias:

José Carlos Macoratti