ASP.NET - GridView - Usando 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 um aoperaçã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.

O objeto GridViewCommandEventArgs é passado para o método que faz tratamento do evento e isto permite que você determine o nome e o argumento do comando do botão que foi clicado. A classe GridViewCommandEventArgs não contém uma propriedade para indicar qual linha do botão foi clicada. Se você precisa saber qual linha foi clicada passe o índice da linha para o método que trata o evento usando a propriedade CommandArgument.

A propriedade CommandArgument pode conter qualquer string definida pelo programador e complementa a propriedade Commandname permitindo que você forneça qualquer informação adicional para o comando. Assim , se você definir a propriedade CommandName como Sort e definir a propriedade como Ascending será efetuada uma ordenação no modo ascendente.

No exemplo a seguir é demonstrado como usar o evento RowCommand para incluir o nome de um cliente a partir de um GridView em um controle ListBox quando o botão Incluir for clicado;

Abra o Visual Web Developer e no menu File selecione New Web Site informando o nome usandoRowCommand;

A seguir selecione a página Default.aspx e no modo Design a partir do menu Layout inclua uma tabela com uma linha e duas colunas.Arraste um controle GridView para a página e o coloque na primeira coluna; a seguir arraste um controle e o coloque na segunda coluna da tabela conforme figura abaixo:

Na guia GridView Tasks na opção Choose a Data Source selecione <new data source>;

No assistente marque a opção DataBase e selecione o banco de dados Northwind.mdf , e , seguindo o assistente salve a conexão no arquivo web config e selecione a tabela Customers com os campos marcados conforme figura abaixo:

Selecione o controle GridView e clique em Edit Columns, e inclua um ButtonField em Selected Fields definindo a sua propriedade ButtonType como Button , se desejar pode remover alguns campos , com exceção dos campos CustomerID e ContacName; Defina o texto deste botão como Incluire a propriedade CommandName também como Incluir;

Vamos usar o evento RowCommand do controle GridView incluindo no mesmo o código abaixo;
    Protected Sub GridView1_RowCommand(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewCommandEventArgs) _
Handles GridView1.RowCommand

        ' Pode existir mais de um botão no GridView então usamos a propriedade
        ' CommandName para determinar qual botão foi clicado
        If e.CommandName = "Incluir" Then

            ' Converte o indice da linha armazenado na propriedade CommandArguments
            ' para um inteiro
            Dim index As Integer = Convert.ToInt32(e.CommandArgument)

            ' Retorna a linha que contém o botão clicado
            ' pelo usuário a partir da coleção Rows
            Dim row As GridViewRow = GridView1.Rows(index)

            ' Cria um novo objeto ListItem para o cliente na linha
            Dim item As New ListItem()
            item.Text = Server.HtmlDecode(row.Cells(2).Text)

            ' Se o o nome do cliente ja nao foi incluido no ListBox inclui
            ' o objeto ListItem para a coleção Itens do controle ListBox
            If Not ListBox1.Items.Contains(item) Then
                ListBox1.Items.Add(item)
            End If

        End If

    End Sub

- Neste código eu estou usando a propriedade CommandName para verificar se o botão que foi clicado é botão de nome Incluir.

- No exemplo só havia um botão mas pode haver mais de um, e, usando esta propriedade você pode saber qual botão foi clicado.

- Em seguida obtemos o índice da linha do botão clicado e a convertemos para um inteiro.

- Obtemos a linha do botão e criamos um objeto ListItem contendo o campo da terceira célula - row.Cells(2).Text - (ContacName)

- Finalmente verificamos se o ListBox já contém o item e se não o incluímos no controle;O resultado pode ser visto abaixo:

Este é apenas um exemplo de como você pode usar este evento para realizar determinadas tarefas quando um usuário clicar em um botão do controle GridView.

Agora existe um problema interessante que pode ocorrer se você fizer o seguinte;

- Se você definir a propriedade CommandName do botão como Delete e existir um ObjectDataSource vinculado no qual você gerou os comandos para incluir, alterar e deletar através do botão Advanced...

Quando clicar no botão vai obter uma mensagem de erro pois o método Delete configurado no ObjectDataSource tentará ser executado, e , para o nosso caso a tabela Customers esta relacionada com a tabela Orders havendo um conflito

Então cuidado com esta armadilha ao atribuir os nomes dos botões a propriedade CommandName use nomes distintos dos comandos usados no objectDatasource.

Até  próximo artigo...


José Carlos Macoratti