ASP .NET - Paginação e exclusão múltipla com LINQ to SQL


Que tal usar os recursos do LINQ to SQL para criar uma aplicação ASP .NET com paginação e ainda de quebra realizar a exclusão de múltiplos registros.

Vamos começar definindo o banco de dados e as tabelas que iremos acessar. Eu vou usar o banco de dados Macoratti.mdf que é uma cópia simplificada e em português do banco de dados Northwind.mdf e foi criado usando SQL Server Management Studio.

Nota: Para saber como criar o banco de dados e tabelas no SQL Server veja o artigo: Usando o SQL Server Management Studio

Observe que eu destaquei as tabelas Clientes e Paises pois serão elas que eu irei usar no exemplo deste artigo.

Vamos então criar um novo web site usando o Visual Web Developer 2008 Express Edition. No menu File -> New web site selecione o template ASP .NET Web Site , escolha a linguagem C# e informe o nome PaginacaoLINQ;

Após isso selecione o projeto na janela Solution Explorer e clique no menu WebSite -> Add New Item e selecione o template LINQ to SQL Classes informando o nome Clientes.dbml e clique no botão Add;

O arquivo será criado na pasta App_Code;

A janela do descritor LINQ será aberta então a partir da janela do DataBase Explorer selecione e arraste as tabelas Clientes e Paises para a área vazia do descritor LINQ de forma a gerar as classes mapeadas: Pais e Cliente;

Com isso o acesso aos dados esta garantido e iremos fazer isso usando consultas LINQ no arquivo code-behind Default.aspx.cs;

Selecione a página Default.aspx e no modo Design vamos incluir uma tabela contendo os componentes GridView (ID=gdvClientes), Button (ID= btnDeletar) e Label (ID=lblmsg) conforme o leiaute abaixo:

Observe que temos um controle CheckBox no GridView para incluí-lo criamos um TemplateField e definimos um ItemTemplate onde incluímos um controle CheckBox com o ID=ch1;

O código da página Default.aspx ficou da seguinte forma:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>Paginação com LINQ</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
       <table >           
            <tr> 
                <td> 
                    <div align="center">                
                      <table > 
                            <tr> 
                                <td> 
                                    <asp:GridView ID="gdvClientes" runat="server" AutoGenerateColumns="False" 
                                        onpageindexchanging="GridView1_PageIndexChanging" Height="166px" 
                                        Width="379px" CellPadding="4" ForeColor="#333333" GridLines="None">           
                                        <RowStyle BackColor="#EFF3FB" />
                                        <Columns>                
                                            <asp:TemplateField> 
                                                <ItemTemplate> 
                                                    <asp:CheckBox ID="ch1" runat="server" /> 
                                                </ItemTemplate> 
                                           </asp:TemplateField> 
                                            <asp:BoundField HeaderText="Cliente ID" DataField="clienteid" /> 
                                            <asp:BoundField HeaderText="Nome " DataField="nome" /> 
                                            <asp:BoundField HeaderText="Pais " DataField="pais" /> 
                                        </Columns> 
                                        <FooterStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" />
                                        <PagerStyle BackColor="#2461BF" ForeColor="White" HorizontalAlign="Center" />
                                        <SelectedRowStyle BackColor="#D1DDF1" Font-Bold="True" ForeColor="#333333" />
                                        <HeaderStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" />
                                        <EditRowStyle BackColor="#2461BF" />
                                        <AlternatingRowStyle BackColor="White" />
                                    </asp:GridView> 
                                 </td> 
                             </tr> 
                            <tr> 
                                <td> 
                                    <asp:Button ID="btnDeletar" runat="server" Text="Deletar" 
                                        onclick="Button1_Click" /> 
                                 </td> 
                            </tr> 
                            <tr> 
                                <td> 
                                    <asp:Label ID="lblmsg" runat="server"></asp:Label>
                                 </td> 
                            </tr> 
                      </table>        
                    </div> 
                </td> 
            </tr> 
        </table>        
    </div>
    </form>
</body>
</html>

Agora vejamos o código usado na aplicação.

Primeiro devemos definir o namespace : using System.Collections;

A seguir no início do arquivo Default.aspx.cs vamos definir as variáveis:

private int paginaAtual = 0;
ArrayList alist = new ArrayList();


No evento Load da página vamos definir o código para efetuar a vinculação de dados no GridView:

  protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            Bindgridview(); //vincula o Gridview. 
            lblmsg.Text = "";
        } 
    }

A rotina Bindgridview() possui o seguinte código:

   private void Bindgridview()
    {
        using (ClientesDataContext db = new ClientesDataContext())
        {
            var info = from cli in db.Clientes
                       join paisID in db.Pais on cli.pais equals paisID.id
                       select new
                       {
                           clienteid = cli.clienteid,
                           nome      = cli.nome,
                           pais      = paisID.pais
                       };

            if (info != null)
            {
                gdvClientes.AllowPaging = true;
                gdvClientes.PageSize = 4;
                gdvClientes.PageIndex = paginaAtual;
                gdvClientes.DataSource = info;
                gdvClientes.DataBind();
            }
        }
    }

Neste código usamos criamos uma instância do o DataContext criado pelo LINQ to SQL - ClientesDataContext - chamada db;

using (ClientesDataContext db = new ClientesDataContext())

A seguir usamos uma consulta LINQ para selecionar os dados da tabela Clientes onde o nome do pais esta sendo obtido da tabela Pais;

var info = from cli in db.Clientes
              join paisID in db.Pais on cli.pais equals paisID.id
              select new
             {
                clienteid = cli.clienteid,
                nome = cli.nome,
                pais = paisID.pais
             };

Se houver dados para exibir então definimos algumas propriedades do Grid e exibimos as informações obtidas:

if (info != null)
{
gdvClientes.AllowPaging = true;
gdvClientes.PageSize = 4;
gdvClientes.PageIndex = paginaAtual;
gdvClientes.DataSource = info;
gdvClientes.DataBind();
}

Para realizar a paginação da aplicação ASP .NET usamos o evento PageIndexChangind onde incluímos o seguinte código:

   protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e)
    {
        paginaAtual = e.NewPageIndex;
        Bindgridview(); 
    }

Finalmente vejamos o código do evento Click do botão Deletar onde poderemos marcar mais de um registro no GridView para serem excluídos:

   protected void Button1_Click(object sender, EventArgs e)
    {
        for (int i = 0; i < gdvClientes.Rows.Count; i++) 
        { 
            System.Web.UI.WebControls.CheckBox cbb = (System.Web.UI.WebControls.CheckBox)gdvClientes.Rows[i].FindControl("ch1"); 
            if (cbb.Checked == true) 
            { 
                int id = Convert.ToInt32(gdvClientes.Rows[i].Cells[1].Text); 
                alist.Add(id); 
            } 
        }
        using (ClientesDataContext db = new ClientesDataContext())
        {
            for (int j = 0; j < alist.Count; j++)
            {
                int id = Convert.ToInt32(alist[j]);
                var info = from c in db.Clientes
                                where c.clienteid == id
                               select c;

                foreach (var deletainfo in info)
                {
                    db.Clientes.DeleteOnSubmit(deletainfo);
                }
                try
                {
                    db.SubmitChanges();
                }
                catch (Exception ex)
                {
                    lblmsg.Text = "Erro : " + ex.Message;
                }
            }
        }
        paginaAtual = 0;
        Bindgridview();
    }

Verificamos se existe controles CheckBox marcados e obtemos o conteúdo da coluna ClienteID e armazenamos em um array;

A seguir percorremos a lista gerada e obtemos os objetos que possuem o mesmo ID;

for (int j = 0; j < alist.Count; j++)
{
     int id = Convert.ToInt32(alist[j]);
     var info = from c in db.Clientes
                    where c.clienteid == id
                    select c;
.....

Em seguida usamos o método DeleteOnSubmit do LINQ - db.Clientes.DeleteOnSubmit(deletainfo)- para excluir o objeto;

Para efetivar a exclusão dos registros usamos o método : SubmitChanges()

db.SubmitChanges();

E com isso já podemos testar a nossa aplicação. Carregando o projeto iremos obter:

 
Página inicial da aplicaçlão ASP .NET  
 

Como ficou óbvio a utilização do LINQ to SQL facilita muito a vida do desenvolvedor.

Pegue o projeto completo aqui: PaginacaoLINQ.zip

Eu sei é apenas ASP .NET e LINQ to SQL , mas eu gosto...

Referências:


José Carlos Macoratti