Fala Galera, uma coisa que sempre vejo muito em foruns e até mesmo em Blogs é o pessoal falando da necessidade de Paginar Datalist´s e Repeater´s.
Bom Dando uma Pesquisada na Documentação do Framework 2.0 achei uma Classe que faz isso muito Facilmente, e ela de chama.... Tcham tcham tchammmmm.... rsrsrrs
"PagedDataSource"
Ela faz a Paginação automatica do um ObjectDataSource, SQLDataSource e etc...
Então vamos a um Exemplo né Paulo.
Imagine que voce Criou uma Classe utilizando DataReader para fazer a Leitura dos Dados de Uma tabela no Banco Mais ou Menos Assim.
CODE
using System;
using System.Collections.Generic;
using System.Text;
using System.ComponentModel;
using System.Data;
using System.Data.Common;
using Microsoft.Practices.EnterpriseLibrary.Data;
namespace ClassVitSaude
{
[System.ComponentModel.DataObject]
public class produtos
{
private int _idproduto;
public int Idproduto
{
get { return _idproduto; }
set { _idproduto = value; }
}
private int _idfornecedor;
public int Idfornecedor
{
get { return _idfornecedor; }
set { _idfornecedor = value; }
}
private int _idcategoria;
public int Idcategoria
{
get { return _idcategoria; }
set { _idcategoria = value; }
}
private string _nome;
public string Nome
{
get { return _nome; }
set { _nome = value; }
}
private string _resumo;
public string Resumo
{
get { return _resumo; }
set { _resumo = value; }
}
private string _descricao;
public string Descricao
{
get { return _descricao; }
set { _descricao = value; }
}
private decimal _preco;
public decimal Preco
{
get { return _preco; }
set { _preco = value; }
}
private string _foto;
public string Foto
{
get { return _foto; }
set { _foto = value; }
}
private bool _autorizado;
public bool Autorizado
{
get { return _autorizado; }
set { _autorizado = value; }
}
private string _fornecedor;
public string Fornecedor
{
get { return _fornecedor; }
set { _fornecedor = value; }
}
private string _categoria;
public string Categoria
{
get { return _categoria; }
set { _categoria = value; }
}
public produtos()
{
}
public produtos(int idproduto, int idfornecedor, int idcategoria, string nome, string resumo, string descricao,
decimal preco, string foto, bool autorizado, string fornecedor, string categoria)
{
_idproduto = idproduto;
_idfornecedor = idfornecedor;
_idcategoria = idcategoria;
_nome = nome;
_resumo = resumo;
_descricao = descricao;
_preco = preco;
_foto = foto;
_autorizado = autorizado;
_fornecedor = fornecedor;
_categoria = categoria;
}
[DataObjectMethod(DataObjectMethodType.Select, true)]
public List<produtos> Allprodutos()
{
Database db = DatabaseFactory.CreateDatabase("VitSaudeCS");
DbCommand comand = db.GetStoredProcCommand("AllProdutos");
List<produtos> collection = new List<produtos>();
if (comand != null)
{
using (IDataReader reader = db.ExecuteReader(comand))
{
while (reader.Read())
{
produtos txt = new produtos(
(int)reader["idproduto"],
(int)reader["idfornecedor"],
(int)reader["idcategoria"],
(string)reader["nome"],
(string)reader["resumo"],
(string)reader["descricao"],
(decimal)reader["preco"],
(string)reader["foto"],
(bool)reader["autorizado"],
(string)reader["fornecedor"],
(string)reader["categoria"]);
collection.Add(txt);
}
}
}
return collection;
}
}
}
Certo ? isso tras os Dados da Tabela Produtos para serem exibidos em qualquer componente mas a paginação automatica só seria possivel no GridView Correto ? ERRADO....
Imagine de Novo que voce tem um DataList na Pagina de Produtos.aspx
CODE
<asp:DataList ID="DTLRandProds" runat="server" RepeatColumns="4" RepeatDirection="Horizontal"
Style="margin-top: 10px; margin-bottom: 10px">
<ItemTemplate>
<div id="prods" style="width: 100%; height: 100%; text-align: center">
<asp:ImageButton ID="ImageButton2" runat="server" AlternateText='<%# Eval("Nome") %>'
ImageUrl='<%# Eval("Foto","thumbnails.aspx?img=~/imgProdutos/{0}&maxW=80&maxH=60") %>'
PostBackUrl='<%# "~/detProdutos.aspx?idproduto="+Eval("Idproduto") %>' Style="margin: 5px" /><br />
<asp:Label ID="lblnomeProd" runat="server" CssClass="lblnomeprods" Text='<%# Eval("Nome") %>'
Width="130px"></asp:Label><br />
<asp:ImageButton ID="ImageButton3" runat="server" ImageUrl="~/App_Themes/themecliente/Imagens/btn_vejaMais.jpg"
PostBackUrl='<%# Eval("Idproduto", "~/detProdutos.aspx?idproduto={0}") %>' Style="margin-top: 3px" /></div>
</ItemTemplate>
<AlternatingItemStyle BackColor="#f8f8ff" />
<ItemStyle Width="160px" />
</asp:DataList>
A Direferença Agora é que ao Invés de criarmos um ObjectDataSource direto na Pagina, vamos Codificar um pouco né.
na Pagina Produtos.aspx.cs vamos colocar o Seguinte Codigo:
CODE
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using ClassVitSaude;
public partial class Produtos : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
ItemsGet();
}
private void ItemsGet()
{
//Instanciamos a classe que recupera os Produtos
ClassVitSaude.produtos prods = new produtos();
//Instaciamos a Classe PagedDataSource que é a responsavel pela Paginação
PagedDataSource pgds = new PagedDataSource();
//Dizemos que ela esta habilitada para ser paginada
pgds.AllowPaging = true;
//E Informamos que o DataSource do Objeto é a Classe que Criamos.
pgds.DataSource = prods.Allprodutos();
//Dizemos que o Limite de produtos apresentados vai ser de 20 por pagina
pgds.PageSize = 20;
//e o Resto são Informaçãoes de Paginação comun como podem ver abaixo
pgds.CurrentPageIndex = CurrentPage;
lblCurrentPage.Text = "Pagina: " + (CurrentPage + 1).ToString() + " de <b>"
+ pgds.PageCount.ToString() + "</b>";
if (pgds.PageCount == 1 && CurrentPage+1 == 1)
{
lblCurrentPage.Visible = false;
}
else
{
lblCurrentPage.Visible = true;
}
cmdPrev.Visible = !pgds.IsFirstPage;
cmdNext.Visible = !pgds.IsLastPage;
DTLRandProds.DataSource = pgds;
DTLRandProds.DataBind();
}
public void cmdPrev_Click(object sender, EventArgs e)
{
CurrentPage--;
ItemsGet();
}
public void cmdNext_Click(object sender, EventArgs e)
{
CurrentPage++;
ItemsGet();
}
public int CurrentPage
{
get
{
object o = this.ViewState["_CurrentPageProdutos"];
if (o == null || (int)o < 0)
return 0;
else
return (int)o;
}
set
{
this.ViewState["_CurrentPageProdutos"] = value;
}
}
}
e de novo na Pagina Produtos.aspx logo abaixo do Datalist acrescente o seguinte:
CODE
<div id="paging" style="text-align: right; margin-bottom: 15px; clear: both;">
<asp:Label ID="lblCurrentPage" runat="server" Font-Names="Verdana" Font-Size="8pt" ForeColor="#A9A9A9"></asp:Label>
<asp:ImageButton ID="cmdPrev" runat="server" AlternateText="Pagina Anterior" ImageUrl="~/App_Themes/themecliente/Imagens/butback.gif" OnClick="cmdPrev_Click" />
<asp:ImageButton ID="cmdNext" runat="server" AlternateText="Próxima Pagina" ImageUrl="~/App_Themes/themecliente/Imagens/butnext.gif" OnClick="cmdNext_Click" />
</div>
Bom pessoal acho que é isso, não sou muito bom de explcar as coisas mas acho que da pra ajudar um pouco o pessoal que saca um poquinho de asp.net.
Dúvidas ?? é só Postar uma Mensagem que agente ajuda.
Abraços a Todos
Comentários:
sdouglas disse:
Quando ia começar a começar a codificar achei este artigo e não tive que perder tempo criando o que já existia (não conhecia o PageDataSource).
Ver o restante dos comentários no fórum (e aproveitar pra comentar também !).