ASP .NET - GridView e a propriedade DataKeyNames


O controle GridView é um ótimo controle para apresentação de dados em páginas ASP .NET, sendo muito fácil de trabalhar. Para obter um resultado satisfatório é bom conhecer alguns conceitos básicos sobre este controle como a propriedade DataKeyNames e o evento RowCommand.

Eu já tratei do da propriedade DataKeyNames e do evento RowCommand em outros artigos de forma indireta e usando a linguagem VB .NET. Volto ao assunto dando um enfoque à propriedade DataKeyNames do controle GridView.

Vou começar com a definição e depois vou dar um exemplo prático para 'clarear'.

A propriedade DataKeyNames

A propriedade DataKeyNames obtém ou define uma matriz que contém os nomes dos campos da chave primária para os itens exibidos em um controle GridView. Ela também esta disponíveis nos controles DetailsView

Quando definimos a propriedade DataKeyNames o controle GridView preenche de forma automática a coleção DataKeys com os valores a partir do campo ou campos especificados, e dessa forma, temos uma maneira conveniente de acessar as chaves primárias de cada linha.

Você pode definir um ou mais campos separados por vírgula na propriedade DataKeyNames. Ela é uma propriedade do controle GridView. Veja a seguir um exemplo de definição dessa propriedade:

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataKeyNames="ClienteID,ProdutoID" DataSourceID="Macoratti">

Um exemplo de utilização desta propriedade pode ser visto no exemplo a seguir. Nele temos um controle GridView que exibe uma relação de produtos. Cada produto possui um código que esta definido como chave primária na tabela mas que não desejamos exibir no controle GridView.

Embora não desejamos exibir o código vamos precisar dele pois quando o usuário selecionar um produto temos que obter qual o seu código e realizar a ação desejada que pode ser uma inclusão , exclusão, seleção, etc.

Para criar o exemplo usado neste artigo eu vou usar o Visual Web Developer 2010 Express Edition e criar um novo projeto do tipo ASP .NET Empty Web Application;

Vamos usar como fonte de dados o arquivo Northwind.mdf do SQL Server e sua tabela Products. Para tanto vamos gerar um Entity Data Model selecionando no menu Project a opção Add New Item e selecione o template ADO .NET Entity Data Model e informando o nome Produtos.edmx e clicando em Add;

A seguir vamos selecionar a tabela Products e clicar em Finish;

Vamos agora incluir um controle WebForm a partir do Menu Project -> Add New Item e selecionando o template WebForm com o nome Default.aspx e clicando em Add;

Vamos incluir um controle GridView no formulário Default.aspx e a seguir incluir um controle EntityDataSource que iremos usar para vincular os dados com o GridView;

Clique sobre o controle EntityDataSource e selecione Configure Data Source. Na janela do assistente selecione o nome da entidade que geramos no Entity Data Model e clique em Next>;

Selecione a entidade com a qual vamos trabalhar, no caso a entidade Products e marque os campos que deseja tratar no GridView;

Selecione o GridView e em GridView Tasks selecione Edit Columns e exclua a coluna ProductID da exibição do GridView;

Aproveite e inclua um novo campo TemplateField no qual iremos incluir um controle CheckBox e clique em OK;

Selecione o controle GridView e em GridView Tasks selecione Edit templates para em seguida incluir a partir da ToolBox um controle CheckBox no itemtemplate;

Em seguida selecione o controle GridView e na janela Properties clique na propriedade DataKeyNames e selecione o campo ProductId a partir da janela Data Fields Collection editor;

Após isso inclua na página Default.apx um controle Button com o texto : Clique aqui para excluir os produtos Selecionados;

No evento Click do botão inclua o seguinte código :

 Protected Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click
        For Each row As GridViewRow In GridView1.Rows
            If DirectCast(row.FindControl("chkProdutoID"), CheckBox).Checked Then
                Dim produtoID As Integer = Convert.ToInt32(GridView1.DataKeys(row.RowIndex).Value)
                'define uma ação no caso excluir o produto
                deletarProduto(produtoID)
            End If
        Next
    End Sub

Este código percorre cada linha do GridView e verifica se o controle CheckBox esta marcado (Checked) e obtém o valor da propriedade DataKeyNames que será o código do produto da linha selecionada.

E se você precisar passar mais de um valor no DataKeyNames ?

Elementar... Basta na janela de propriedades do GridView clicar em DataKeyNames e selecionar quantos campos desejar conforme exemplo abaixo:

Para obter os valores também é muito simples, basta usar o código a seguir (o trecho de código é uma sugestão):

Dim produtoid As Integer = Convert.ToInt32(gdvDados.DataKeys(0)("produtoid").ToString())
Dim categoriaid As Integer = Convert.ToInt32(gdvDados.DataKeys(1)("categoriaid").ToString())

A ação que será tomada em seguida pode ser a exclusão do registro, o envio de emails para os itens selecionados, etc. No nosso exemplo a rotina deletarProduto() irá apenas exibir em um controle label os códigos dos produtos selecionados para mostrar que a propriedade DatakeyNames realmente obteve os valores do campo ProductID.

O código da rotina deletarProduto() é o seguinte:

 Private Sub deletarProduto(ByVal produtoID As Integer)
        Label1.Text = Label1.Text & produtoID & " ; "
    End Sub

Abaixo temos a execução do projeto onde selecionamos alguns produtos marcando o respectivo checkbox e em seguida clicamos no botão onde capturamos os respectivos valores de cada ProductId selecionado através da propriedade DataKeyNames e exibimos no controle Label;

Simples, simples assim...

Pegue o projeto completo aqui: GridView_DataKeyNames.zip

Eu sei é apenas ASP .NET, mas eu gosto...

Referências:

José Carlos Macoratti