自定义datalist分页(转)

DataList Web 服务器控件以某种格式显示数据,这种格式可以使用模板和样式进行定义。DataList 控件可用于任何重复结构中的数据,如表。DataList 控件可以以不同的布局显示行,如按列或行对数据进行排序。DataList 控件不能自动利用数据源控件的更新功能以及自动分页或排序。若要使用 DataList 控件执行更新、分页和排序,必须在编写的代码中执行更新任务。 

在PetShop4.0中,有一个叫做CustomList的类引起了我们的注意,它继承了DataList类,并对其进行了改写,现了分页功能,然而,PetShop4.0中对分页功能较简单(只有上下翻页功能),本文介绍PetShop4.0中DataList类的改写思路,并对其进行进一步的研究。

一、效果图

这个效果图比较粗糙,读者可以根据自己的需要,对其进行改写。

二、具体改写的代码

 

using System;
using System.Collections;
using System.Collections.Specialized;
using System.Text;
using System.Text.RegularExpressions;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace CustomList {

    
public class CustomList : DataList {
        
//Static constants
        private string HTML1 = "<table cellpadding=0 cellspacing=0 ><tr><td colspan=13>";
        
protected const string HTML2 = "</td></tr><tr>";
        
protected const string HTML4 = "</tr></table>";
        
private static readonly Regex RX = new Regex(@"^&page=d+", RegexOptions.Compiled);
        
private const string LINK_PREV = "<td><a href=?page={0}>&nbsp;上一页</a></td>";
        
private const string LINK_MORE = "<td><a href=?page={0}>下一页&nbsp;</a></td>";
        
private const string LINK_DISPLAY = "<td><a href=?page={0}>&nbsp;{1}&nbsp;</a></td>";
        
private const string KEY_PAGE = "page";
        
private const string COMMA = "?";
        
private const string AMP = "&";
       
        
protected string emptyText;
        
private IList dataSource;
        
private int pageSize = 10;
        
private int currentPageIndex;
        
private int itemCount;
 



        
override public object DataSource {
            
set {
                
//This try catch block is to avoid issues with the VS.NET designer
                
//The designer will try and bind a datasource which does not derive from ILIST
                try {
                    dataSource 
= (IList)value;
                    ItemCount 
= dataSource.Count;
                }

                
catch {
                    dataSource 
= null;
                    ItemCount 
= 0;
                }

            }

        }


        
public int PageSize {
            
get return pageSize; }
            
set { pageSize = value; }
        }


        
protected int PageCount {
            
get return (ItemCount - 1/ pageSize; }
        }


        
virtual protected int ItemCount {
            
get return itemCount; }
            
set { itemCount = value; }
        }


        
virtual public int CurrentPageIndex {
            
get return currentPageIndex; }
            
set { currentPageIndex = value; }
        }


        
public string EmptyText {
            
set { emptyText = value; }
        }


        
public void SetPage(int index) {
            OnPageIndexChanged(
new DataGridPageChangedEventArgs(null, index));
        }


        
override protected void OnLoad(EventArgs e) {
            
if (Visible) {
                
string page = Context.Request[KEY_PAGE];
                
int index = (page != null? int.Parse(page)-1 : 0;
                SetPage(index);
            }

        }



        
/// <summary>
        
/// Overriden method to control how the page is rendered
        
/// </summary>
        
/// <param name="writer"></param>

        override protected void Render(HtmlTextWriter writer) {

            
//Check there is some data attached
            if (ItemCount == 0{
                writer.Write(emptyText);
                
return;
            }


            
//Mask the query
            string query = Context.Request.Url.Query.Replace(COMMA, AMP);
            query 
= RX.Replace(query, string.Empty);


            
// Write out the first part of the control, the table header
            writer.Write(HTML1);

            
// Call the inherited method
            base.Render(writer);

            
            
// Write out a table row closure
            writer.Write(HTML2);

            
//列表信息
            writer.Write("<td>共&nbsp;" + PageCount + "&nbsp;页&nbsp;" + itemCount + "&nbsp项</td>");
            
//导航到上一页
            if (currentPageIndex > 0)
                writer.Write(
string.Format(LINK_PREV, (currentPageIndex ) + query));
            
else
            
{
                writer.Write(
"<td>&nbsp;上一页&nbsp;</td>");
            }


            
//得到页码导航
            for (int i =0; i <= 9 && i <= PageCount && (currentPageIndex - currentPageIndex % 10 + i)<=PageCount ; i++)
                
{
                    
if (currentPageIndex - currentPageIndex % 10 + i == currentPageIndex)
                    
{
                        writer.Write(
"<td>&nbsp;" + (currentPageIndex+1+ "&nbsp;</td>");
                    }

                    
else
                    
{
                        writer.Write(
string.Format(LINK_DISPLAY, (currentPageIndex - currentPageIndex % 10 + i+1+ query,(currentPageIndex - currentPageIndex % 10 + i+1));

                    }

                }

           
            
//导航到下一页
            if (currentPageIndex < PageCount)
                writer.Write(
string.Format(LINK_MORE, (currentPageIndex + 2+ query));
            
else
            
{
                writer.Write(
"<td>&nbsp;下一页&nbsp;</td>");
            }


            
//Close the table
            writer.Write(HTML4);
        }


        
override protected void OnDataBinding(EventArgs e) {

            
//Work out which items we want to render to the page
            int start = CurrentPageIndex * pageSize;
            
int size = Math.Min(pageSize, ItemCount - start);

            IList page 
= new ArrayList();

            
//Add the relevant items from the datasource
            for (int i = 0; i < size; i++)
                page.Add(dataSource[start 
+ i]);

            
//set the base objects datasource
            base.DataSource = page;
            
base.OnDataBinding(e);

        }


        
public event DataGridPageChangedEventHandler PageIndexChanged;

        
virtual protected void OnPageIndexChanged(DataGridPageChangedEventArgs e) {
            
if (PageIndexChanged != null)
                PageIndexChanged(
this, e);
        }

    }

}

三、新建一个类库工程,把上面代码保存为CustomList.cs,再重新生成,在工具栏便会多出一个用户自定义组件。

四、对其进行调用

1.新建网站,在新页面中拖拽一个CustomList组件。

2.对CustomList组件进行前台属性设置

<%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default" %>

<%@ Register Assembly="CustomList" Namespace="CustomList" TagPrefix="cc1" %>

<!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>无标题页</title>
</head>
<body>
    
<form id="form1" runat="server">

        
<cc1:CustomList ID="productsList" runat="server"  EmptyText="No products found." OnPageIndexChanged="PageChanged" PageSize="12" RepeatColumns="1" CellPadding="4" Width="400px" CurrentPageIndex="1" ForeColor="#333333">
                        
<ItemTemplate>
            
<table cellpadding="0" cellspacing="0">
                
<tr>
                    
<td valign="top" width="400px" align="center" ><%Eval("dc")%></td>
                    
                                      
                
</tr>               
            
</table>            
        
</ItemTemplate>
            
<FooterStyle BackColor="#990000" Font-Bold="True" ForeColor="White" />
            
<SelectedItemStyle BackColor="#FFCC66" Font-Bold="True" ForeColor="Navy" />
            
<AlternatingItemStyle BackColor="White" />
            
<ItemStyle BackColor="#FFFBD6" ForeColor="#333333" />
            
<HeaderStyle BackColor="#990000" Font-Bold="True" ForeColor="White" />
        
</cc1:CustomList>
    
</form>
</body>
</html>

22.后台页面程序绑定

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 System.Collections;
public partial class _Default : System.Web.UI.Page 
{
    
protected void Page_Load(object sender, EventArgs e)
    
{
    }

    
protected void PageChanged(object sender, DataGridPageChangedEventArgs e)
    
{
        
//reset index
        productsList.CurrentPageIndex = e.NewPageIndex;

        
//构造要作为数据源显示的表
        DataTable dt = new DataTable("tabe1");
        DataColumn dc 
= new DataColumn("dc");
        dt.Columns.Add(dc);
//构造一列
        for (int i = 1; i <= 100; i++)//循环加入数据
        {
            DataRow dr 
= dt.NewRow();
            dr[
"dc"="数据"+ i;
            dt.Rows.Add(dr);

        }


        
//bind data
        productsList.DataSource = dt.DefaultView;
        productsList.DataBind();

    }

}



Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1669427

posted @ 2007-09-07 11:49  子午  阅读(590)  评论(1编辑  收藏  举报