ASP .NET - CRUD com GridView acessando MySQL e Entity Framework (revisão) - II


Neste artigo vou mostrar como podemos criar uma aplicação Web acessando o MySQL via Entity Framework e realizando o CRUD usando um controle GridView.

Na primeira parte do artigo criamos o projeto, definimos a tabela e o banco de dados, criamos o modelo de entidades e criamos a página Default.aspx definindo a interface com o usuário usando o GridView e os recursos do BootStrap.

Vamos agora definir o código nos eventos do controle GridView para realizar a manutenção dos dados.

Abrindo a solução no VS Community

Abra o VS Community 2015 e clique em Open Project;

Selecione o projeto GridView_MySQL criado na primeira parte do artigo.

No início do arquivo, após a declaração da classe vamos criar uma instância do nosso contexto para poder acessar as entidades mapeadas pelo entity framework:

Dim db As New cadastroEntities()

Dessa forma db agora é uma instância do contexto de entidades que iremos usar para acessar as entidades mapeadas.

A seguir abra o arquivo Default.aspx.vb (o code-behind) e no evento Load inclua o código abaixo:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        If Not IsPostBack Then
            BindGrid()
        End If
 End Sub

Verificamos se não ocorre um postback e chamamos o método BindGrid() que é mostrado a seguir:

Private Sub BindGrid()
        Dim query = From emp In db.funcionarios.ToList()
        If query.Count() > 0 Then
            grdFuncionarios.DataSource = query
            grdFuncionarios.DataBind()
        End If

End Sub

Neste método estamos fazendo uma LINQ usando o nosso contexto para retornar todos os funcionários cadastrados na tabela funcionarios. (Nota: em uma aplicação de produção nunca retorne todos os registros de uma tabela. Use uma cláusula Where, por exemplo, para restringir o número de registros retornados)

No evento Click do botão Salvar insira o código abaixo:

    Protected Sub btnSalvar_Click(sender As Object, e As EventArgs)
        Try
            'obtem os dados do novo funcionário
            Dim funci As New funcionario
            funci.nome = txtNome.Text
            funci.cargo = txtCargo.Text
            funci.salario = Convert.ToInt32(txtSalario.Text)
            'adiciona o novo funci no contexto e persiste os dados na tabela
            db.funcionarios.Add(funci)
            db.SaveChanges()
            BindGrid()
            txtCargo.Text = String.Empty
            txtNome.Text = String.Empty
            txtSalario.Text = String.Empty
        Catch ex As Exception
            lblaviso.Text = "Erro :" & ex.Message
        End Try
  End Sub

O código do evento Click do botão Cancelar, dado a seguir, apenas limpa os controles:

  Protected Sub btnCancelar_Click(sender As Object, e As EventArgs)
        'limpa as caixas de texto
        txtCargo.Text = String.Empty
        txtNome.Text = String.Empty
        txtSalario.Text = String.Empty
  End Sub

Agora vamos ao código dos eventos RowEditing que edita a linha selecionada e RowCancelingEdit que cancela a edição:

 Protected Sub grdFuncionarios_RowEditing(sender As Object, e As GridViewEditEventArgs) Handles grdFuncionarios.RowEditing
        grdFuncionarios.EditIndex = e.NewEditIndex
        BindGrid()
    End Sub
 Protected Sub grdFuncionarios_RowCancelingEdit(sender As Object, e As GridViewCancelEditEventArgs) Handles grdFuncionarios.RowCancelingEdit
        grdFuncionarios.EditIndex = -1
        BindGrid()
End Sub

No evento RowUpdating estamos atualizado os dados do funcionário:

 Protected Sub grdFuncionarios_RowUpdating(sender As Object, e As GridViewUpdateEventArgs) Handles grdFuncionarios.RowUpdating
        Try
            'obtem os dados do gridview
            Dim hfFunciId As HiddenField = DirectCast(grdFuncionarios.Rows(e.RowIndex).FindControl("hfFunciId"), HiddenField)
            Dim txtGridNome As TextBox = DirectCast(grdFuncionarios.Rows(e.RowIndex).FindControl("txtGridNome"), TextBox)
            Dim txtGridCargo As TextBox = DirectCast(grdFuncionarios.Rows(e.RowIndex).FindControl("txtGridCargo"), TextBox)
            Dim txtGridSalario As TextBox = DirectCast(grdFuncionarios.Rows(e.RowIndex).FindControl("txtGridSalario"), TextBox)
            Dim codigo As Integer = Convert.ToInt32(hfFunciId.Value)
            'localiza o funcionário
            Dim funci As funcionario = (From f In db.funcionarios Where f.id = codigo Select f).FirstOrDefault()
            'atualiza os dados do funcionario
            funci.nome = txtGridNome.Text
            funci.cargo = txtGridCargo.Text
            funci.salario = Convert.ToInt32(txtGridSalario.Text)
            'persiste as alterações
            db.SaveChanges()
            grdFuncionarios.EditIndex = -1
            BindGrid()
        Catch ex As Exception
            lblaviso.Text = "Erro :" & ex.Message
        End Try
    End Sub

Para excluir um funcionários usamos o evento RowDeleting :

 Protected Sub grdFuncionarios_RowDeleting(sender As Object, e As GridViewDeleteEventArgs) Handles grdFuncionarios.RowDeleting
        Try
            'obtem os dados do grid
            Dim hfFunciId As HiddenField = DirectCast(grdFuncionarios.Rows(e.RowIndex).FindControl("hfFunciId"), HiddenField)
            Dim codigo As Integer = Convert.ToInt32(hfFunciId.Value)
            'localiza o funcionario
            Dim funci As funcionario = (From f In db.funcionarios Where f.id = codigo Select f).FirstOrDefault()
            'remove o funci do contexto
            db.funcionarios.Remove(funci)
            'persiste os dados
            db.SaveChanges()
            BindGrid()
        Catch ex As Exception
            lblaviso.Text = "Erro :" & ex.Message
        End Try
    End Sub

Vamos usar também o evento RowDataBound para solicitar a confirmação da exclusão ao usuário:

  Protected Sub grdFuncionarios_RowDataBound(sender As Object, e As GridViewRowEventArgs) Handles grdFuncionarios.RowDataBound
        Try
            If e.Row.RowState = (DataControlRowState.Edit Or DataControlRowState.Alternate) Or e.Row.RowState = DataControlRowState.Edit Then
                Return
            End If
            'verifica o tipo de linha 
            If e.Row.RowType = DataControlRowType.DataRow Then
                'Referencia ao linkbutton delete
                Dim deleteButton As ImageButton = DirectCast(e.Row.Cells(4).Controls(0), ImageButton)
                deleteButton.OnClientClick = "if (!window.confirm('Confirma a exclusão deste registro ?')) return false;"
            End If
        Catch ex As Exception
            lblaviso.Text = "Erro :" & ex.Message
        End Try
 End Sub

Executando o projeto iremos obter o seguinte resultado:

Pegue o projeto completo aqui : GridView_Linq_MySQL.zip

Jesus Cristo é o mesmo, ontem, e hoje, e eternamente.
Hebreus 13:8

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

Quer aprender a criar aplicações Web Dinâmicas usando a ASP .NET MVC 5 ?

 

  Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

 

Referências:


José Carlos Macoratti