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.OleDbNo 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" ThengdvNotas.Columns(3).Visible = TrueElse gdvNotas.Columns(3).Visible = FalseEnd 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" ThengdvNotas.Columns(3).Visible = True
Else
gdvNotas.Columns(3).Visible = False
End If
End IfEstamos 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") = 3Me.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 ' VisualizapnlNota.Visible = FalseExit 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
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") = notaIDIf e.CommandName = "cmdEdita" Then ViewState.Item( "Flag") = 1 'modo ediçãoEditaVisualizaLinha(notaID) End IfIf e.CommandName = "cmdVisualiza" Then ViewState.Item( "Flag") = 2 ' modo de visualizaçãoEditaVisualizaLinha(notaID) End IfIf e.CommandName = "cmdDeleta" Then ViewState.Item( "Flag") = 9 ' modo de exclusãoExcluiNota(notaID) End IfEnd 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.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