您的位置:首页 > 其它

使用Relations建立表之间的关系并却使用PagedDataSource类对DataList进行分页

2008-09-18 08:43 441 查看
最近做一个关于三级联动的例子。想在页面上显示像树形控件一样的效果,每一个大类下面有各自的子类。所以使用了Relations建立了表之间的关系(Relations是获取用于将表链接起来并允许从父表浏览到子表的关系的集合)
并却使用了PagedDataSource对DataList进行了分页(PagedDataSource封装 DataGrid 控件的属性,这些属性使该控件可以执行分页).DataGrid的自带的分页就是使用的这个类。所以不能进行大量数据的分页.

首先建立两张表,SQL语句如下:
IndexPage为主表,SePage为子表
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[IndexPage]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[IndexPage]
GO

CREATE TABLE [dbo].[IndexPage] (
[IndexID] [int] IDENTITY (1, 1) NOT NULL ,
[IndexName] [varchar] (100) COLLATE Chinese_PRC_CI_AS NULL ,
[Content] [varchar] (1000) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY]
GO

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[SePage]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[SePage]
GO

CREATE TABLE [dbo].[SePage] (
[SeID] [int] IDENTITY (1, 1) NOT NULL ,
[IndexID] [int] NULL ,
[SeName] [varchar] (100) COLLATE Chinese_PRC_CI_AS NULL ,
[Content] [varchar] (1000) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY]
GO

存储过程:(1)GetIndexPage
CREATE PROC GetIndexPage
AS
SELECT * FROM INDEXPAGE

(2)GetSecondPage
CREATE PROC GetSecondPage
AS
SELECT * FROM SEPAGE

基本效果

HTML代码:

<%@ Page language="c#" Codebehind="ShowYellowPage.aspx.cs" AutoEventWireup="false" Inherits="WLNet.YellowPage.ShowYellowPage" %>
<%@ Import Namespace="System.Data" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<HTML>
<HEAD>
<title>ShowYellowPage</title>
<meta content="Microsoft Visual Studio .NET 7.1" name="GENERATOR">
<meta content="C#" name="CODE_LANGUAGE">
<meta content="JavaScript" name="vs_defaultClientScript">
<LINK href="../CSS/BasicLayout.css" type="text/css" rel="stylesheet">
<meta content="http://schemas.microsoft.com/intellisense/ie5" name="vs_targetSchema">
</HEAD>
<body MS_POSITIONING="GridLayout">
<form id="Form1" method="post" runat="server">
<table class="GbText" style="BORDER-COLLAPSE: collapse" borderColor="#cccccc" width="100%"
align="center" border="1">
<TR>
<TD style="HEIGHT: 15px" align="center"><font style="FONT-SIZE: 10pt">共</font>
<asp:label id="lbTotalPage" runat="server"></asp:label><font style="FONT-SIZE: 10pt">页/共
<asp:label id="lbTotalCount" runat="server"></asp:label>记录  当前</font>
<asp:label id="lbCurrentPage" runat="server"></asp:label><font style="FONT-SIZE: 10pt">页</font>          
<font style="FONT-SIZE: 10pt">跳转到</font>
<asp:dropdownlist id="ddlPage" runat="server" Width="65px" AutoPostBack="True"></asp:dropdownlist><font style="FONT-SIZE: 10pt">页</font></TD>
</TR>
<tr>
<td><asp:datalist id="dlParent" runat="server" Width="100%" RepeatColumns="2">
<ItemStyle Font-Size="X-Small"></ItemStyle>
<ItemTemplate>
<A href='<%# "ShowData.aspx?IndexID="+DataBinder.Eval(Container,"DataItem.IndexID")%>'>
<%# DataBinder.Eval(Container,"DataItem.IndexName")%>
</A>
<asp:DataList id="dlChild" runat="server" datasource='<%# ((DataRowView)Container.DataItem).Row.GetChildRows("MyRelations") %>'>
<ItemTemplate>
        <a href='<%# "ShowData.aspx?SeID="+DataBinder.Eval(Container.DataItem, "[/"SeID/"]")%>'><%# DataBinder.Eval(Container.DataItem, "[/"SeName/"]")%></a>
<br>
</ItemTemplate>
</asp:DataList>
</ItemTemplate>
<HeaderStyle Font-Size="X-Small"></HeaderStyle>
</asp:datalist></td>
</tr>
<tr>
<TD align="center" height="30"><b><asp:hyperlink id="lnkFirst" runat="server">第一页</asp:hyperlink>    <asp:hyperlink id="lnkPrev" runat="server">上一页</asp:hyperlink>  
<asp:hyperlink id="lnkNext" runat="server">下一页</asp:hyperlink>   
<asp:HyperLink id="lnkLast" runat="server">末一页</asp:HyperLink></b></TD>
</tr>
</table>
</form>
</body>
</HTML>
CS代码:

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.SqlClient;
using ClassDataBase;
namespace WLNet.YellowPage
{
/// <summary>
/// ShowYellowPage 的摘要说明。
/// </summary>
public class ShowYellowPage : System.Web.UI.Page
{
private ClassYPage YPage=new ClassYPage();
protected System.Web.UI.WebControls.Label lbTotalPage;
protected System.Web.UI.WebControls.Label lbTotalCount;
protected System.Web.UI.WebControls.Label lbCurrentPage;
protected System.Web.UI.WebControls.DropDownList ddlPage;
private string strConn=System.Configuration.ConfigurationSettings.AppSettings["ConnectionString"].ToString();
protected Int32 CurrentPageNumber = 1;
protected System.Web.UI.WebControls.HyperLink lnkPrev;
protected System.Web.UI.WebControls.HyperLink lnkNext;
protected System.Web.UI.WebControls.DataList dlParent;
protected System.Web.UI.WebControls.HyperLink lnkFirst;
protected System.Web.UI.WebControls.HyperLink lnkLast;//初始化,设置当前页为1,随时都要使用
protected int PageSize=10;
private void Page_Load(object sender, System.EventArgs e)
{
if(!IsPostBack)
{
BindData();
}
}

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

/// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
/// </summary>
private void InitializeComponent()
{
this.ddlPage.SelectedIndexChanged += new System.EventHandler(this.ddlPage_SelectedIndexChanged);
this.Load += new System.EventHandler(this.Page_Load);

}
#endregion

private void BindData()
{
SqlConnection Conn=new SqlConnection(strConn);
SqlCommand cmd=new SqlCommand("GetIndexPage",Conn);
cmd.CommandType=CommandType.StoredProcedure;
SqlDataAdapter da=new SqlDataAdapter();
da.SelectCommand=cmd;
DataSet ds=new DataSet();
da.Fill(ds,"IndexPage");

SqlCommand cmd1=new SqlCommand("GetSePage",Conn);
cmd1.CommandType=CommandType.StoredProcedure;
SqlDataAdapter da1=new SqlDataAdapter();
da1.SelectCommand=cmd1;
da1.Fill(ds,"SePage");

ds.Relations.Add("MyRelations",ds.Tables["IndexPage"].Columns["IndexID"],
ds.Tables["SePage"].Columns["IndexID"]);

PagedDataSource Pds = new PagedDataSource();
Pds.DataSource = ds.Tables["IndexPage"].DefaultView;
Pds.AllowPaging = true;
Pds.PageSize = 10;
int CurrentPageNumber;
int PageSize=Pds.PageSize;
//当前页面从Page查询参数获取
if (Request.QueryString["Page"] != null)
CurrentPageNumber=Convert.ToInt32(Request.QueryString["Page"]);
else
CurrentPageNumber=1;
int TotalRecords=ds.Tables[0].Rows.Count;
int TotalPages = TotalRecords / PageSize;//得到总页数(总记录数除以每页的记录数)
int ModePages=TotalRecords%PageSize;//得到取模的余数(总记录数取模每页的记录数)
if(ModePages>0)//如果取模数不等于0,则把总页数加1
{
TotalPages+=1;
}
if(ModePages==0)//如果取模数等于0,不做任何事(也可以不用判断)
{
}
if(TotalPages==0)
{
TotalPages=1;
}
lbTotalPage.Text = TotalPages.ToString();//显示页面上的总页数
lbTotalCount.Text=TotalRecords.ToString();//显示页面上的总记录数
Pds.CurrentPageIndex = CurrentPageNumber-1;
lbCurrentPage.Text=CurrentPageNumber.ToString();

if ( CurrentPageNumber == 1 )
{
lnkFirst.Enabled = false;
lnkPrev.Enabled=false;
if ( TotalPages > 1 )
{
lnkNext.Enabled = true;
lnkLast.Enabled=true;
}
else
{
lnkNext.Enabled = false;
lnkLast.Enabled=false;
}
}
else
{
lnkPrev.Enabled = true;
lnkFirst.Enabled=true;

if ( CurrentPageNumber == TotalPages )
{
lnkNext.Enabled = false;
lnkLast.Enabled=false;
}
else
{
lnkNext.Enabled = true;
lnkLast.Enabled=true;
}
}

if (!Pds.IsFirstPage)
{
lnkPrev.NavigateUrl=Request.CurrentExecutionFilePath + " ?Page=" + Convert.ToString(CurrentPageNumber-1);
lnkFirst.NavigateUrl=Request.CurrentExecutionFilePath + "?Page=" + 1;
}

if (!Pds.IsLastPage)
{
lnkNext.NavigateUrl=Request.CurrentExecutionFilePath+ "?Page=" + Convert.ToString(CurrentPageNumber+1);
lnkLast.NavigateUrl=Request.CurrentExecutionFilePath+ "?Page=" + Convert.ToString(TotalPages);
}
ddlPage.Items.Clear();//清楚跳转的页数(如果不清除,里面的记录将会循环增加)
int PCount=int.Parse(lbTotalPage.Text);//得到总页数,为了循环
for(int i=1;i<=PCount;i++)
{
ddlPage.Items.Add(i.ToString());
}
ddlPage.Items.FindByText(CurrentPageNumber.ToString()).Selected=true;//把当前页显示在列表框的第一个
//把PagedDataSource 对象赋给Repeater控件
dlParent.DataSource=Pds;
dlParent.DataBind();

}

private void ddlPage_SelectedIndexChanged(object sender, System.EventArgs e)
{
int PageSize=int.Parse(ddlPage.SelectedValue.ToString());
Server.Transfer("ShowYellowPage.aspx?Page="+PageSize);
BindData();
}

}
}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: