我想做一个商品展览的展览页,就是有商品图片,然后图片下面是商品名称和说明。我用DataList和SQLSource绑定可以实现这样的功能,但是却不能够分页,各位大大有没有办法?或者教一下这种展览页的其他制作方法?用Gridview可以分页,但是却不能够实现多列分布,而且还有一个表头。

解决方案 »

  1.   

    "SQLSource绑定"对绑定前的数据分页处理
      

  2.   

    PagedDataSource objds = new PagedDataSource();
            objds.DataSource = ds.Tables["ss"].DefaultView;//dataset  数据源
            objds.AllowPaging = true;
            objds.PageSize = 6;
            //Label6.Text = "总共有" + objds.PageCount.ToString() + "页";
            //int curpage;
            //if (Request.QueryString["page"] != null)
            //{
            //    curpage = Convert.ToInt32(Request.QueryString["page"].ToString());
            //}
            //else
            //{
            //    curpage = 1;
            //}
            //objds.CurrentPageIndex = curpage - 1;
            //Label7.Text = "当前第" + curpage.ToString() + "页";
            //if (!objds.IsFirstPage)
            //{
            //    HyperLink4.NavigateUrl = Request.CurrentExecutionFilePath + "?page=" + Convert.ToString(curpage - 1);
            //}
            //if (!objds.IsLastPage)
            //{
            //    HyperLink5.NavigateUrl = Request.CurrentExecutionFilePath + "?page=" + Convert.ToString(curpage + 1);
            //}        DataList1.DataSource = objds;
            DataList1.DataBind();
      

  3.   

    自己写咯
    用PagedDataSource,例如下面
    //分页开始
                objpage = new PagedDataSource();
                objpage.DataSource = ds.Tables["TB"].DefaultView;
                objpage.AllowPaging = true;
                objpage.PageSize = 36;
                int curpage;
                if (Request.QueryString["Page"] != null)
                    curpage = Convert.ToInt32(Request.QueryString["Page"]);
                else
                    curpage = 1;
                objpage.CurrentPageIndex = curpage - 1;
                if (objpage.IsFirstPage && !objpage.IsLastPage)
                {
                    this.hlProv.Enabled = false;
                    this.hlNext.NavigateUrl = url + "?page=" + Convert.ToInt32(curpage + 1);
                    this.hlFirst.Enabled = false;
                    this.hlLast.NavigateUrl = url + "?page=" + Convert.ToInt32(objpage.PageCount);
                }
                else
                {
                    if (objpage.IsLastPage && !objpage.IsFirstPage)
                    {
                        this.hlFirst.NavigateUrl = url + "?page=" + 1;
                        this.hlLast.Enabled = false;
                        this.hlNext.Enabled = false;
                        this.hlProv.NavigateUrl = url + "?page=" + Convert.ToInt32(curpage - 1);
                    }
                    else
                    {
                        if (objpage.IsFirstPage && objpage.IsLastPage)
                        {
                            this.hlLast.Enabled = false;
                            this.hlNext.Enabled = false;
                            this.hlProv.Enabled = false;
                            this.hlFirst.Enabled = false;
                        }
                        else
                        {
                            this.hlFirst.NavigateUrl = url + "?page=" + 1;
                            this.hlLast.NavigateUrl = url + "?page=" + Convert.ToInt32(objpage.PageCount);
                            this.hlNext.NavigateUrl = url + "?page=" + Convert.ToInt32(curpage + 1);
                            this.hlProv.NavigateUrl = url + "?page=" + Convert.ToInt32(curpage - 1);
                        }
                    }
                }
      
      

  4.   

    两位大大,请问objds.DataSource = ds.Tables["ss"].DefaultView;指的是什么呀?
    我用SQLSource连接名为Database数据库的photo表。还用另一种方法连接了这个数据表,就是创建了一个教DataSet1.xsd的数据集,在数据集里面建立了photo表的查询的一个getPhoto()方法。然后通过在程序里面调用可以得到查询的结果:
    using System;
    using System.Data;
    using System.Configuration;
    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 DataSet1TableAdapters;public partial class _Default : System.Web.UI.Page 
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            photoTableAdapter photo = new photoTableAdapter();
            DataList1.DataSource = photo.getPhoto();        
            DataList1.DataBind();
        }
     
    }你们程序里面的ds.Tables["ss"].DefaultView中的ds指的是我上面方法中的哪一部分呀?还是要用其他的方法来建这个ds?“SS”指的是表名吗?
      

  5.   

    一般两种方法
    1。用VIEW来做,但缺点是DATASET太大,没有效率
    2。 用SQL端分页方法。2。0里已经有支持。1。1中要利用临时表来处理
      

  6.   

    SQL端分页是指编写SQL查询语句的时候加入分页功能吗?那应该怎么写啊?
    比如select * form photo应该怎么改?
      

  7.   

    给你个例子
    using System;
    using System.Collections;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Web;
    using System.Web.SessionState;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.HtmlControls;
    using System.Data.OleDb;namespace WebText
    {
    /// <summary>
    /// fenye 的摘要说明。
    /// </summary>
    public class fenye : System.Web.UI.Page
    {
    protected System.Web.UI.WebControls.DataList DataList1;
    protected System.Web.UI.WebControls.Label LPageCount;
    protected System.Web.UI.WebControls.Label LRecordCount;
    protected System.Web.UI.WebControls.LinkButton Fistpage;
    protected System.Web.UI.WebControls.LinkButton Prevpage;
    protected System.Web.UI.WebControls.LinkButton Nextpage;
    protected System.Web.UI.WebControls.LinkButton Lastpage;
    protected System.Web.UI.WebControls.Label LCurrentPage;
    protected System.Web.UI.WebControls.TextBox gotoPage;

    const int PageSize=5;//定义每页显示记录
    int PageCount,RecCount,CurrentPage,Pages,JumpPage; private void Page_Load(object sender, System.EventArgs e)
    {
    // 在此处放置用户代码以初始化页面

     

    if(!IsPostBack)
    {
    RecCount = Calc();//通过Calc()函数获取总记录数
    PageCount = RecCount/PageSize + OverPage();//计算总页数(加上OverPage()函数防止有余数造成显示数据不完整) ViewState["PageCounts"] = RecCount/PageSize -  ModPage();//保存总页参数到ViewState(减去ModPage()函数防止ole语句执行时溢出查询范围,可以用存储过程分页算法来理解这句)
    ViewState["PageIndex"] = 0;//保存一个为0的页面索引值到ViewState
    ViewState["JumpPages"] = PageCount;//保存PageCount到ViewState,跳页时判断用户输入数是否超出页码范围
    //显示LPageCount、LRecordCount的状态
    this.LPageCount.Text = PageCount.ToString();
    LRecordCount.Text = RecCount.ToString();
    //判断跳页文本框失效
    if(RecCount <= 5)
    gotoPage.Enabled = false;
    TDataBind();//调用数据绑定函数TDataBind()进行数据绑定运算
    }


    } #region Web 窗体设计器生成的代码
    override protected void OnInit(EventArgs e)
    {
    //
    // CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
    //
    InitializeComponent();
    base.OnInit(e);
    }

    /// <summary>
    /// 设计器支持所需的方法 - 不要使用代码编辑器修改
    /// 此方法的内容。
    /// </summary>
    private void InitializeComponent()
    {    
    this.DataList1.SelectedIndexChanged += new System.EventHandler(this.DataList1_SelectedIndexChanged);
    this.Fistpage.Command += new System.Web.UI.WebControls.CommandEventHandler(this.Page_OnClick);
    this.Prevpage.Command += new System.Web.UI.WebControls.CommandEventHandler(this.Page_OnClick);
    this.Nextpage.Command += new System.Web.UI.WebControls.CommandEventHandler(this.Page_OnClick);
    this.Lastpage.Command += new System.Web.UI.WebControls.CommandEventHandler(this.Page_OnClick);
    this.gotoPage.TextChanged += new System.EventHandler(this.gotoPage_TextChanged);
    this.Load += new System.EventHandler(this.Page_Load); }
    #endregion private void ImageButton1_Click(object sender, System.Web.UI.ImageClickEventArgs e)
    {
    Response.Redirect("");
    } private void DataList1_SelectedIndexChanged(object sender, System.EventArgs e)
    {

    string cname = ((ImageButton)sender).CommandArgument;
    Response.Redirect("WebForm5.aspx?id="+cname);
    } //计算余页
    public int OverPage()
    {
    int pages = 0;
    if(RecCount%PageSize != 0)
    pages = 1;
    else
    pages = 0;
    return pages;
    }
    //计算余页,防止ole语句执行时溢出查询范围
    public int ModPage()
    {
    int pages = 0;
    if(RecCount%PageSize == 0 && RecCount != 0)
    pages = 1;
    else
    pages = 0;
    return pages;
    }
    /*
       *计算总记录的静态函数
       *本人在这里使用静态函数的理由是:如果引用的是静态数据或静态函数,连接器会优化生成代码,去掉动态重定位项(对海量数据表分页效果更明显)。
       *希望大家给予意见、如有不正确的地方望指正。
      */
    public  int Calc()
    {


    string databasepath="database/db.mdb";
    OleDbConnection conn=new OleDbConnection("provider=Microsoft.jet.OLEDB.4.0;data Source="+Server.MapPath(databasepath)+";");
    conn.Open();
    int RecordCount = 0;
    OleDbCommand MyCmd = new OleDbCommand("select count(*) as co from rh",conn);
    OleDbDataReader dr = MyCmd.ExecuteReader();
    if(dr.Read())
    RecordCount = Int32.Parse(dr["co"].ToString());
    conn.Close();
    return RecordCount;
    }
    //数据库连接语句(从Web.Config中获取)
    // public  OleDbConnection MyCon()
    // {
    //
    // string databasepath="../database/db.mdb";
    // // string str="select * from rh";
    // OleDbConnection MyConnection=new OleDbConnection("provider=Microsoft.jet.OLEDB.4.0;data Source="+Server.MapPath(databasepath)+";");
    // MyConnection.Open();
    //
    // return MyConnection;
    // }
    //
      

  8.   

    //对四个按钮(首页、上一页、下一页、尾页)返回的CommandName值进行操作
    private void Page_OnClick(object sender, CommandEventArgs e)
    {
    CurrentPage = (int)ViewState["PageIndex"];//从ViewState中读取页码值保存到CurrentPage变量中进行参数运算
    Pages = (int)ViewState["PageCounts"];//从ViewState中读取总页参数运算 string cmd = e.CommandName;
    switch(cmd)//筛选CommandName
    {
    case "next":
    CurrentPage++;
    break;
    case "prev":
    CurrentPage--;
    break;
    case "last":
    CurrentPage = Pages;
    break;
    default:
    CurrentPage = 0;
    break;
    }
    ViewState["PageIndex"] = CurrentPage;//将运算后的CurrentPage变量再次保存至ViewState
    TDataBind();//调用数据绑定函数TDataBind()
    } private void TDataBind()
    {
    CurrentPage = (int)ViewState["PageIndex"];//从ViewState中读取页码值保存到CurrentPage变量中进行按钮失效运算
    Pages = (int)ViewState["PageCounts"];//从ViewState中读取总页参数进行按钮失效运算
    //判断四个按钮(首页、上一页、下一页、尾页)状态
    if (CurrentPage + 1 > 1)
    {
    Fistpage.Enabled = true;
    Prevpage.Enabled = true;
    }
    else
    {
    Fistpage.Enabled = false;
    Prevpage.Enabled = false;
    }
    if (CurrentPage == Pages)
    {
    Nextpage.Enabled = false;
    Lastpage.Enabled = false;
    }
    else
    {
    Nextpage.Enabled = true;
    Lastpage.Enabled = true;
    }
    //数据绑定到DataList控件
    string databasepath="database/db.mdb";
    OleDbConnection conn=new OleDbConnection("provider=Microsoft.jet.OLEDB.4.0;data Source="+Server.MapPath(databasepath)+";");
    conn.Open();
    DataSet ds = new DataSet();
    //核心ole语句,进行查询运算(决定了分页的效率:))


    if(CurrentPage==0)
    {

    OleDbDataAdapter MyAdapter = new OleDbDataAdapter("Select Top "+PageSize+" * from rh  order by id asc",conn);
    MyAdapter.Fill(ds,"rh");
    DataList1.DataSource = ds.Tables["rh"].DefaultView;
    DataList1.DataBind();
    //显示Label控件LCurrentPaget和文本框控件gotoPage状态
    LCurrentPage.Text = (CurrentPage+1).ToString();
    gotoPage.Text = (CurrentPage+1).ToString();
    //释放oleDataAdapter
    MyAdapter.Dispose();

    }
    else
    {

    OleDbDataAdapter MyAdapter = new OleDbDataAdapter("Select Top "+PageSize+" * from rh where id not in(select top "+PageSize*CurrentPage+" id from rh order by id asc) order by id asc",conn);
    MyAdapter.Fill(ds,"rh");
    DataList1.DataSource = ds.Tables["rh"].DefaultView;
    DataList1.DataBind();
    //显示Label控件LCurrentPaget和文本框控件gotoPage状态
    LCurrentPage.Text = (CurrentPage+1).ToString();
    gotoPage.Text = (CurrentPage+1).ToString();
    //释放oleDataAdapter
    MyAdapter.Dispose();
    }
    } // #region Web 窗体设计器生成的代码
    // override protected void OnInit(EventArgs e)
    // {
    // //
    // // CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
    // //
    // InitializeComponent();
    // base.OnInit(e);
    // }
      
    /// <summary>
    /// 设计器支持所需的方法 - 不要使用代码编辑器修改
    /// 此方法的内容。
    /// </summary>
    // private void InitializeComponent()
    // {    
    // this.Fistpage.Command += new System.Web.UI.WebControls.CommandEventHandler(this.Page_OnClick);
    // this.Prevpage.Command += new System.Web.UI.WebControls.CommandEventHandler(this.Page_OnClick);
    // this.Nextpage.Command += new System.Web.UI.WebControls.CommandEventHandler(this.Page_OnClick);
    // this.Lastpage.Command += new System.Web.UI.WebControls.CommandEventHandler(this.Page_OnClick);
    // this.gotoPage.TextChanged += new System.EventHandler(this.gotoPage_TextChanged);
    // this.Load += new System.EventHandler(this.Page_Load);
    //
    //// }
    // #endregion
    // //跳页代码
    private void gotoPage_TextChanged(object sender, System.EventArgs e)
    {
    try
    {
    JumpPage = (int)ViewState["JumpPages"];//从ViewState中读取可用页数值保存到JumpPage变量中
    //判断用户输入值是否超过可用页数范围值
    if(Int32.Parse(gotoPage.Text) > JumpPage || Int32.Parse(gotoPage.Text) <= 0)
          Response.Write("<script>alert('页码范围越界!');location.href='WebForm8.aspx'</script>");
    else
    {
    int InputPage = Int32.Parse(gotoPage.Text.ToString()) - 1;//转换用户输入值保存在int型InputPage变量中
    ViewState["PageIndex"] = InputPage;//写入InputPage值到ViewState["PageIndex"]中
    TDataBind();//调用数据绑定函数TDataBind()再次进行数据绑定运算
    }
    }
    //捕获由用户输入不正确数据类型时造成的异常
    catch(Exception exp)
    {
    Response.Write("<script>alert('"+exp.Message+"');location.href='WebForm8.aspx'</script>");
    }
    }

    }
    }
      

  9.   

    Html:
    <%@ Page language="c#" Codebehind="fenye.aspx.cs" AutoEventWireup="false" Inherits="WebText.fenye" %>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
    <HTML>
    <HEAD>
    <title>WebText2</title>
    <meta content="Microsoft Visual Studio .NET 7.1" name="GENERATOR">
    <meta content="C#" name="CODE_LANGUAGE">
    <meta content="JavaScript" name="vs_defaultClientScript">
    <meta content="http://schemas.microsoft.com/intellisense/ie5" name="vs_targetSchema">
    </HEAD>
    <body MS_POSITIONING="GridLayout">
    <form id="Form1" method="post" runat="server">
    <FONT face="宋体">
    <TABLE id="Table1" style="Z-INDEX: 101; LEFT: 8px; WIDTH: 696px; POSITION: absolute; TOP: 8px; HEIGHT: 654px"
    cellSpacing="1" cellPadding="1" width="696" border="1">
    <TBODY>
    <TR>
    <TD style="HEIGHT: 545px">
    <DIV align="center">
    <DIV align="center">&nbsp;</DIV>
    <FONT face="宋体">
    <asp:DataList id="DataList1" runat="server" Height="368px" Width="336px">
    <ItemTemplate>
    <table width="100%" height="94" border="1" cellpadding="0" cellspacing="0">
    <tr>
    <td rowspan="3">
    <A href='<%# "Web.aspx?cname=" + Server.UrlEncode((DataBinder.Eval(Container.DataItem, "cname")).ToString()) %>'>
    <asp:Image id="Imagebutton2" runat="server" width="80px" height="80px" ImageUrl='<%#DataBinder.Eval(Container.DataItem,"path")%>'>
    </asp:Image>
    </A>
    </td>
    <td width="71%">城市名字:<%#DataBinder.Eval(Container.DataItem,"cname")%></td>
    </tr>
    <tr>
    <td>文件名字:<%#DataBinder.Eval(Container.DataItem,"filename")%></td>
    </tr>
    <tr>
    <td>文件路径:<%#DataBinder.Eval(Container.DataItem,"path")%></td>
    </tr>
    </table>
    </ItemTemplate>
    </asp:DataList>
    <div align="center">共<asp:label id="LPageCount" Runat="server" ForeColor="#ff0000"></asp:label>页/共
    <asp:label id="LRecordCount" Runat="server" ForeColor="#ff0000"></asp:label>记录
    <asp:linkbutton id="Fistpage" Runat="server" CommandName="0">首页</asp:linkbutton>&nbsp;&nbsp;&nbsp;&nbsp;<asp:linkbutton id="Prevpage" Runat="server" CommandName="prev">上一页</asp:linkbutton>&nbsp;&nbsp;&nbsp;&nbsp;<asp:linkbutton id="Nextpage" Runat="server" CommandName="next">下一页</asp:linkbutton>&nbsp;&nbsp;&nbsp;&nbsp;<asp:linkbutton id="Lastpage" Runat="server" CommandName="last">尾页</asp:linkbutton>&nbsp;&nbsp;&nbsp;&nbsp;当前第<asp:label id="LCurrentPage" Runat="server" ForeColor="#ff0000"></asp:label>页&nbsp;&nbsp;&nbsp;&nbsp;跳页<asp:TextBox ID="gotoPage" Runat="server" Width="105px" MaxLength="5" AutoPostBack="True"></asp:TextBox></div>
    </form>
    </DIV>
    <DIV></DIV>
    <P>&nbsp;</P>
    <P></FONT>&nbsp;</P>
    </FORM></TD></TR>
    <TR>
    <TD></TD>
    </TR>
    </TBODY></TABLE></FONT></FORM>
    </body>
    </HTML>
      

  10.   

    int totalpage;
    int records;
    int page;
    int pagesize=10;
    private void databind()
    {
    if (Request["page"]==null)
    {
    page=1;
    }
    else
    {
    try
    {
    page=Convert.ToInt32(Request["page"]); }
    catch
    {
    page=1;
    }
    }

    SqlConnection myconn=new SqlConnection(ConfigurationSettings.AppSettings["conn"]);
    string sql="select * from bbs order by time desc";
    myconn.Open();
    SqlDataAdapter myda=new SqlDataAdapter(sql,myconn);
    DataSet allbbs=new DataSet();
    myda.Fill(allbbs);
    DataSet dsbbs=new DataSet();
    records=allbbs.Tables[0].Rows.Count;
    int startpage=(page-1)*pagesize;
    int endpage=startpage+pagesize;
    totalpage=records/pagesize;
    if (totalpage*pagesize<records)
    {
    totalpage++;
    }
    if (endpage>records)
    endpage=records;
    dsbbs=allbbs.Clone();
    for (int i=startpage;i<endpage;i++)
    {
    DataRow row=dsbbs.Tables[0].NewRow();
    row.ItemArray=allbbs.Tables[0].Rows[i].ItemArray;
    dsbbs.Tables[0].Rows.Add(row);
    }
    lbpage.Text=page+"/"+totalpage;
    lbrc.Text=records.ToString(); ViewState["page"]=page.ToString();

    lbpage.Text=page+"/"+totalpage; if (Request.QueryString["Page"] != null)
    page=Convert.ToInt32(Request.QueryString["Page"]);
    else
    page=1;
    if (totalpage<page)
    page=totalpage;
    if (page<=0)
    page=1;
    if (page<=1)
     


    hlnext.Enabled = true;
    hlprev.Enabled = true;
    if(page==(totalpage))
    {
    hlnext.Enabled = false;

    }
    else
    hlnext.NavigateUrl=Request.CurrentExecutionFilePath+Request.QueryString["Page+1"] +"?page=" + Convert.ToString(page+1);
    if(page==1)
    {
    hlprev.Enabled = false;
    hlnext.Enabled = false;
    }
    else
    hlprev.NavigateUrl=Request.CurrentExecutionFilePath+Request.QueryString["Page-1"] +"?page="+Convert.ToString(page-1);

    mydl.DataSource=dsbbs;
    mydl.DataBind();
      

  11.   

    首先在设计页面上定义两个Label控件:ID分别为“labNowPage”和“labCount”,分别用来显示当前页数和总页数。
    再定义四个LinkButton控件,ID分别为“lnkbtnTop”、“lnkbtnPrve”、“lnkbtnNext”和“lnkbtnLast”,分别用来进行“首页”、“上一页”、“下一页”和“尾页”的翻页操作。
    当然还有一个DataList(ID="DataList1")控件了。//cs文件中的内容
    protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                dlBind();
            }
        }
        public void dlBind()
        {
            int curpage = Convert.ToInt32(labNowPage.Text);
            PagedDataSource ps = new PagedDataSource();
            SqlConnection myCnn = new SqlConnection("server=(local);uid=sa;pwd=sa;database=pubs");
            myCnn.Open();
            SqlDataAdapter myAdp = new SqlDataAdapter("select * from authors", myCnn);
            DataSet ds = new DataSet();
            myAdp.Fill(ds, "authors");        ps.DataSource = ds.Tables["authors"].DefaultView;
            ps.AllowPaging = true;
            ps.PageSize = 4;
            ps.CurrentPageIndex = curpage - 1;        lnkbtnPrve.Enabled = true;
            lnkbtnTop.Enabled = true;
            lnkbtnNext.Enabled = true;
            lnkbtnLast.Enabled = true;
            if (curpage == 1)
            {
                lnkbtnTop.Enabled = false;
                lnkbtnPrve.Enabled = false;
            }
            if (curpage == ps.PageCount)
            {
                lnkbtnNext.Enabled = false;
                lnkbtnLast.Enabled = false;
            }
            labCount.Text = Convert.ToString(ps.PageCount);
            DataList1.DataSource = ps;
            DataList1.DataKeyField = "au_id";
            DataList1.DataBind();
        }
        protected void lnkbtnPrve_Click(object sender, EventArgs e)
        {
            labNowPage.Text = Convert.ToString(Convert.ToInt32(labNowPage.Text) - 1);
            dlBind();
        }
        protected void lnkbtnTop_Click(object sender, EventArgs e)
        {
            labNowPage.Text = "1";
            dlBind();
        }
        protected void lnkbtnNext_Click(object sender, EventArgs e)
        {
            labNowPage.Text = Convert.ToString(Convert.ToInt32(labNowPage.Text) + 1);
            dlBind();
        }
        protected void lnkbtnLast_Click(object sender, EventArgs e)
        {
            labNowPage.Text = labCount.Text;
            dlBind();
        }