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