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