ASP.NET  - Criando um NotePad para web - IV


Esta é a última parte do meu artigo  ASP.NET  - Criando um NotePad para web I e  continuando vou mostrar como criar a página Principal.aspx que é vai efetuar a exibição e edição das mensagens no editor web.

Feito o cadastro o usuário já poderá ter acesso ao Editor clicando na opção Editor do menu. Neste momento ele acionará a página Principal.aspx que apresentará o formulário onde será exibida as mensagens já escritas, se as mesmas existirem, e o botão Nova Anotação para registrar uma nova anotação.

A página apresentada quando usuário clicar no botão - Nova Anotação - é mostrada a seguir. Nela o usuário deve informar o título do texto e a seguir digitar o seu texto na caixa de texto. Para salvar o texto basta clicar no botão Salvar;

Após incluir uma anotação ela aparece no GridView e permite ser visualizada ou alterada;

Desta forma o usuário poderá incluir novas anotações ou editar as anotações feitas selecionando-as em um GridView que é exibido na base da página;

Vejamos então leiaute da página Principal.aspx:

Para criar o leiaute ao lado usamos controles básicos como Label, Button e TextBox;

Os controles foram incluídos em um Table criada a partir do menu Layout -> Insert Table;

A área de texto para digitar uma anotação foi colocada em um Panel e no seu interior um TextBox com a propriedade TextMode definida como Multiline;

O GridView - gdvNotas - esta vinculado ao AccessDataSource accNotaDS que aponta para o banco de dados em :

~/App_Data/Anotacoes.mdb

e utiliza o seguinte comando SQL:

SELECT [titulo], [nota], [usuarioID], [notaID] FROM [Notas] WHERE ([usuarioID] = ?)

 

A instrução SQL - SELECT [titulo], [nota], [usuarioID], [notaID] FROM [Notas] WHERE ([usuarioID] = ?) - possui como parâmetro o código do usuário que é obtido a partir da sessão conforme vemos na definição de parâmetros do assistente;

Vejamos a seguir o código do arquivo Principal.aspx.vb;

No início temos a declaração dos namespaces:

Imports System.Data.OleDb
Imports
System.Data

No evento Load da página temos o código:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

 

If Session("uID") = Nothing Then

     Response.Redirect("Login.aspx")

Else

    If Session("uPerfil") = "admin" Then

          gdvNotas.Columns(3).Visible = True

      Else

         gdvNotas.Columns(3).Visible = False

     End If

End If

 

Me.lbl_NomeUsuario.Text = "Bem-vindo " + Session.Item("uNome")


If
IsPostBack = False Then
' carregado pela primeira vez

     ViewState.Add("Flag", 0)

     ViewState.Add("NotaID", -1)

      Me.pnlNota.Visible = False

End If
 

End Sub

Quando a página é carregada verificamos se existe um usuário definido na sessão; Se não existir então redirecionamos para a página de Login.aspx;

If Session("uID") = Nothing Then

     Response.Redirect("Login.aspx")

Else

    If Session("uPerfil") = "admin" Then

          gdvNotas.Columns(3).Visible = True

      Else

         gdvNotas.Columns(3).Visible = False

     End If

End If

Estamos verificando também o perfil do usuário , e, se ele for um administrador o gridview - gdvNotas - irá exibir a coluna com a opção para deletar uma anotação;

Nota: Ao cadastrar um usuário o seu perfil padrão definido é igual a 'user' ; a definição do perifl 'admin' é feita diretamente no banco de dados pois não foi feito um tratamento e implementação desta definição na aplicação.

Em seguida exibimos o nome do usuário , obtido a partir da sessão na Label: Me.lbl_NomeUsuario.Text = "Bem-vindo " + Session.Item("uNome")

Se for a primeira vez que a página é carregada então incluímos no ViewState duas variáveis : flag e NotaID com os valores 0 e -1, e ocultamos o Panel da página definindo sua propriedade Visible como False.

If IsPostBack = False Then ' carregado pela primeira vez

     ViewState.Add("Flag", 0)

     ViewState.Add("NotaID", -1)

      Me.pnlNota.Visible = False

End If

 

A propriedade ViewState do ASP.NET para páginas e controles individuais tem duas finalidades:  manter o estado entre solicitações e armazenar valores personalizados em um campo oculto protegido e resistente a violações.

Ref.: Usando Web Forms II   e  PostBack e ciclo de vida de uma página e  Persistindo valores entre Web Forms

Se o usuário clicar no botão Sair o código do evento Click do botão, exibido a seguir, irá limpar a sessão e redirecionar o usuário para página Default.aspx;

Protected Sub Btn_Sair_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Btn_Sair.Click

    'limpa a sessão e redireciona para a pagina inicial

   Session.Clear()

   Response.Redirect("Default.aspx")

End Sub

 

Se o usuário clicar no botão Nova Anotação o código associado ao evento Click define o modo de inclusão de uma nova nota definindo a variável flag como sendo igual a 3 e exibindo o Panel da página; com isso o usuário poderá incluir uma nova anotação;

Protected Sub Btn_NovaNota_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Btn_NovaNota.Click

    'define o modo de inclusÆo de uma nova nota

   ViewState.Item("Flag") = 3

    Me.pnlNota.Visible = True

End Sub

Após digitar um texto para a anotação, para salvar o texto, o usuário deverá clicar no botão Salvar cujo código é o seguinte:

Protected Sub Btn_Ok_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Btn_Ok.Click

 

Dim conn As New OleDbConnection

Dim comm As New OleDbCommand
 

Dim caminhoBD As String = ConfigurationManager.AppSettings("caminhoBD")

Dim conexaoBD As String = ConfigurationManager.AppSettings("conexaoBD")

 

conn.ConnectionString = conexaoBD & Server.MapPath(caminhoBD)

comm.Connection = conn

Select Case ViewState.Item("Flag")

  Case 1 ' Edita

         comm.CommandText = "Update Notas set titulo = '" + Me.txt_Titulo.Text + "', Nota = '" + Me.txt_Nota.Text + "' where notaID = " + Str(ViewState("NotaID"))

  Case 2 ' Visualiza

         pnlNota.Visible = False

            Exit Sub

    Case 3 ' Inserir

        comm.CommandText = "INSERT INTO Notas(Titulo,Nota, usuarioID) VALUES ('" + Me.txt_Titulo.Text + "','" + Me.txt_Nota.Text + "'," + Str(Session.Item("uID")) + ")"

End Select


Try

   conn.Open()

    comm.ExecuteNonQuery()

    conn.Close()

     Me.gdvNotas.DataBind()

Catch ex As Exception

      Me.lbl_Mensagem.Text = ex.Message.ToString '"Erro ao acessar os dados."

End Try

  Me.pnlNota.Visible = False

End Sub

Vale destacar no código acima que estamos verificando a variável Flag através do ViewState e se o valor for igual a 1 iremos realizar uma edição do texto usando a instrução SQL :

"Update Notas set titulo = '" + Me.txt_Titulo.Text + "', Nota = '" + Me.txt_Nota.Text + "' where notaID = " + Str(ViewState("NotaID"))

o valor do parâmetro NotaID é também  obtido do ViewState().

Caso o valor de Flag seja igual a 3 iremos realizar uma inclusão usando a instrução SQL:

INSERT INTO Notas(Titulo,Nota, usuarioID) VALUES ('" + Me.txt_Titulo.Text + "','" + Me.txt_Nota.Text + "'," + Str(Session.Item("uID")) + ")"

O parâmetro uID , código do usuário, é obtido a partir da sessão e o caminho do bando de dados e a string de conexão estão sendo obtidos a partir do arquivo web.config:

Dim caminhoBD As String = ConfigurationManager.AppSettings("caminhoBD")

Dim conexaoBD As String = ConfigurationManager.AppSettings("conexaoBD")

A seguir temos o código associado ao evento RowCommand. O evento RowCommand ocorre quando um botão/Link é clicado em um controle GridView. Você pode usar este evento e executar uma determinada tarefa com base na ação do usuário.

Você pode também usar a propriedade CommandName para definir operações que serão realizadas quando um botão for clicado no controle GridView. A seguir as ações realizadas conforme o valor do CommandName:

Valor Descrição
"Cancel" Cancela uma operação de edição e retorna o GridView para o modo ready-only. Dispara o evento RowCancelingEdit.
"Delete" Deleta o registro atual. Dispara os eventos RowDeleting e RowDeleted.
"Edit" Põe o registro atual no modo de edição. Dispara o evento RowEditing.
"Page" Realiza uma operação de paginação. Define a propriedade CommandArgument do botão para "First", "Last", "Next", "Prev", ou um número de página para especificar o tipo de operação de paginação a ser realizada.Dispara os eventos PageIndexChanging e PageIndexChanged.
"Select" Seleciona o registro atual. Dispara os eventos SelectedIndexChanging e SelectedIndexChanged.
"Sort" Ordena o controle GridView. Dispara os eventos Sorting e Sorted.
"Update" Atualiza o registro atual em uma fonte de dados.Dispara os eventos RowUpdating e RowUpdated.

Mesmo que o evento RowCommand seja disparado quando um dos botões acima seja clicado no GridView é recomendável que você use os eventos listados na tabela para realizar as operações. No nosso exemplo estamos usando os valores: cmdEdita , cmdVisualiza e cmdDeleta.

Protected Sub gdvNotas_RowCommand(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewCommandEventArgs) Handles gdvNotas.RowCommand

 

Dim index As Integer = Convert.ToInt32(e.CommandArgument)

Dim selectedRow As GridViewRow = gdvNotas.Rows(index)

Dim notaID As Integer = selectedRow.Cells(4).Text

 

ViewState.Item("NotaID") = notaID

If e.CommandName = "cmdEdita" Then

    ViewState.Item("Flag") = 1 'modo edição

    EditaVisualizaLinha(notaID)

End If

 

If e.CommandName = "cmdVisualiza" Then

   ViewState.Item("Flag") = 2 ' modo de visualização

    EditaVisualizaLinha(notaID)

End If

 

If e.CommandName = "cmdDeleta" Then

   ViewState.Item("Flag") = 9 ' modo de exclusão

    ExcluiNota(notaID)

End If

 

End Sub

Para mais detalhes veja o meu artigo : ASP. NET - GridView - usando o evento  RowCommand.

A rotina EditaVisualizaLinha() , chamada quando os links Visualizar e Editar são clicados, é responsável por obter da tabela Notas a anotação selecionada e exibir nos controles do formulário web os dados obtidos; para isso é usado a instrução SQL: "SELECT Titulo,Nota FROM Notas WHERE NotaID = " + Str(ID)
O parâmetro ID é passado para a rotina e é obtido a partir do GridView :
Dim notaID As Integer = selectedRow.Cells(4).Text  no evento RowCommand.

Protected Sub EditaVisualizaLinha(ByVal ID As Integer)

 

Dim conn As New OleDbConnection

Dim comm As New OleDbCommand

Dim Reader As OleDbDataReader

Dim caminhoBD As String = ConfigurationManager.AppSettings("caminhoBD")

Dim conexaoBD As String = ConfigurationManager.AppSettings("conexaoBD")

 

conn.ConnectionString = conexaoBD & Server.MapPath(caminhoBD)

comm.Connection = conn

comm.CommandText = "SELECT Titulo,Nota FROM Notas WHERE NotaID = " + Str(ID)

Try

    conn.Open()

    Reader = comm.ExecuteReader(CommandBehavior.CloseConnection)

    pnlNota.Visible = True

 

    Reader.Read()

    Me.txt_Titulo.Text = Reader("Titulo").ToString()

      Me.txt_Nota.Text = Reader("Nota")

     Reader.Close()

 

    If ViewState.Item("Flag") = 2 Then

           Me.Btn_Cancela.Visible = False

            Me.txt_Nota.ReadOnly = True

           Me.txt_Titulo.ReadOnly = True

      End If

Catch ex As Exception

    Me.lbl_Mensagem.Text = ex.Message.ToString

End Try

End Sub

Finalmente a rotina ExcluiNota(), que é chamada quando o link Deletar é clicado, irá excluir a anotação selecionada da tabela Notas usando a instrução SQL :  "DELETE FROM Notas WHERE NotaID = " + Str(ID)
O parâmetro ID é passado para a rotina e é obtido a partir do GridView : Dim notaID As Integer = selectedRow.Cells(4).Text  no evento RowCommand. Lembrando que somente o usuário com perfil 'admin' tem acesso a este link.

Protected Sub ExcluiNota(ByVal ID As Integer)

 

Dim conn As New OleDbConnection

Dim comm As New OleDbCommand

Dim caminhoBD As String = ConfigurationManager.AppSettings("caminhoBD")

Dim conexaoBD As String = ConfigurationManager.AppSettings("conexaoBD")

 

conn.ConnectionString = conexaoBD & Server.MapPath(caminhoBD)

comm.Connection = conn

comm.CommandText = "DELETE FROM Notas WHERE NotaID = " + Str(ID)

Try

   conn.Open()

   comm.ExecuteNonQuery()

   conn.Close()


   Me.gdvNotas.DataBind()

Catch ex As Exception

     Me.lbl_Mensagem.Text = ex.Message.ToString '"Erro ao acessar os dados."

End Try

 

End Sub

E com isso temos o nosso editor Web - Super Editor - NotePad - Web - que apresenta as funcionalidades básicas de incluir, alterar e excluir anotações em um banco de dados via Web. Poderíamos incrementar o projeto com novas funcionalidades de edição com suporte a formatação de texto usando um componente com mais recursos que o TextBox ( veja o artigo : ASP . NET - Usando o Componente FreeTextBox )

O objetivo foi mostrar que não  é muito complicado criar um editor de textos simples para web. Aguarde em breve novos artigos sobre o assunto...

Até mais ver ...


José Carlos Macoratti