Olá pessoal, em março eu publiquei um artigo aqui falando diretamente do uso dos componentes GridView e RowCommand. Falei sobre esses dois assuntos mas, para ficar melhor para entender, deixei de fora uma propriedade do componente GridView, o chamado
DataKeysNames.
Por isso, resolvi escrever agora falando desse componente GridView: ação RowCommand e propriedade DataKeysNames.
Referências
- Ferramenta:
Visual Studio .NET 2008 - Linguagem: C#.NET
- Plataforma: Web
Antigamente, não existia esse
componente chamado GridView, era DataGrid. Na atualização do framework e
ferramenta de desenvolvimento Visual Studio.NET, eles criaram esse novo
componente chamado GridView com algumas importantes alterações e melhorias.
Como
resultado final do artigo anterior, se o usuário trocasse a coluna da chave, no meu caso CH_AUTENTICACAO, o software
deixaria de funcionar, pois ao tentar pegar, a chave viria outro dado.
Este
problema existia também com o DataGrid, e na versão mais nova colocaram uma
solução de chave mais simples e específica. O mais importante é que, se a
posição das tabelas for alterada, não terá problema algum em pegar a chave comCommand.
Com a mesma estrutura do artigo
anterior, veremos o passo a passo para colocar a chave e pegar essa mesma chave de acordo com a
linha selecionada.
<asp:GridView ID="gridUsuario" runat="server" Width="100%"
AutoGenerateColumns="false" onrowcommand="gridUsuario_RowCommand" DataKeyNames="CH_AUTENTICACAO">
<Columns>
<asp:BoundField DataField="NO_USUARIO" HeaderText="Usuário" />
<asp:BoundField DataField="NO_SISTEMA" HeaderText="Sistema" />
<asp:BoundField DataField="CH_AUTENTICACAO" HeaderText="Id" />
<asp:ButtonField ButtonType="Image" CommandName="Delete"
ImageUrl="~/App_Themes/Padrao/image/fechar.jpg"
ControlStyle-Width="15" HeaderText="Excluir"/>
</Columns>
</asp:GridView>
A primeira coisa é gerar o grid com os
campos que preciso para aparecer na tabela. A tag <asp:BoudField> é um
campo normal. Dentro deste campo existe a propriedade chamada DataField; coloquei o nome que veio do meu banco de dados, ou seja, da tabela do meu banco
de dados. Note que para cada campo eu fiz a mesma coisa, só o último que não. É
um pouco diferente.
Depois
disto, note que no início do <asp:GridView> existe uma propriedade
chamada onRowCommand, com o valor “gridUsuario_RowCommand”. Por que ele colocou
esse valor? Porque o Id do GridView chama “gridUsuario” e, com isso, o software
atribui automaticamente o nome “underline” ao comando que, no nosso caso é
RowCommand.
Para
atribuir este OnRowCommand é necessário mudar a aba na apresentação para Design
ou Split. Automaticamente aparecerá o grid (veja a imagem 01). Veja
que agora há mais uma propriedade, chamada DataKeyNames,
antes das colunas definidas, ou seja, da palavra Columns. Como valor dessa propriedade DataKeyNames coloquei a chave da minha tabela do banco de dados
chamada CH_AUTENTICACAO.
Imagem 01
Depois de selecionado, acessei as
propriedades e cliquei em Events:
Selecionei a Ação RowCommand clicando
duas vezes. Automaticamente foi criado o nome gridUsuarioRowCommand. Dessa forma, no grid, foi acrescentado aquela
linha de comando [onrowcommand=”gridUsuario_RowCommand]. Além disso, um método foi criado:
protected void gridUsuario_RowCommand(object sender,GridViewCommandEventArgs e)
{}
Voltando para a página de apresentação,
criei um novo campo para armazenar uma imagem com função de botão:
<asp:ButtonField ButtonType="Image" CommandName="Delete"
ImageUrl="~/App_Themes/Padrao/image/fechar.jpg"
ControlStyle-Width="15" HeaderText="Excluir"/>
Coloquei o tipo
de botão com a propriedade ButtonType e o valor Image. Depois, informei o nome
do comando que será executado, CommandName=”Delete”. Escolhi para aparecer uma
imagem ao invés de um texto; caso queira deixar deixar um texto, não há problema algum. Para finalizar, coloquei o nome do título da coluna chamada
“Excluir”. Aquele título que fica lá em cima.
É lógico que não parou por ai, agora
preciso colocar o código principal para que, depois de acionado, o clique execute
o comando Delete.
protected void gridUsuario_RowCommand(object sender, GridViewCommandEventArgs e)
{
if (e.CommandName == "Delete")
{
int index = int.Parse((string)e.CommandArgument);
string chave = gridUsuario.DataKeys[index]["CH_AUTENTICACAO"].ToString();
_usuario.deleteUsuario(Convert.ToInt32(chave));
Response.Redirect("manterusuario.aspx");
}
}
A primeira coisa foi perguntar se esse
comando é igual a “Delete”. Se for, com o mesmo argumento, pego o index
referente à linha selecionada. A linha selecionada precisa ser identificada
para saber qual a que preciso deletar. A minha chave principal está dentro da
propriedade DataKeysNames, ou seja, a chave da tabela de dados.
Com o index selecionado, basta colocar
o campo chave da minha tabela:
string chave = gridUsuario.DataKeys[index]["CH_AUTENTICACAO"].ToString();
Depois de pegar o
valor correto, chamei o método de negócio passando os parâmetros e redirecionei
para a mesma página.
_usuario.deleteUsuario(Convert.ToInt32(chave));
Response.Redirect("manterusuario.aspx");
Além disso, você pode colocar mensagens
de confirmação e tudo mais. Fica aí uma dica para incrementar. O resultado
final é esse:
Como as informações são confidenciais,
escolhi riscá-las.
Não falei como conectar no banco de
dados nem nada, só quis mostrar como deixar funcionando o uso do componente
gridView com o comando RowCommand. As questões com o banco de dados de select e
delete é com você.
Espero que tenha gostado
qualquer coisa só entrar em contato.