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
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 FormsA 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