为什么我的分页不行的呀,前五页行的,后面的就点不下去了.这是怎么回事呀,请o0O.net进来看一下

zhouxujian 2003-09-15 02:37:53
Sub myNewsGroup_PageIndexChanged(sender As Object, e As DataGridPageChangedEventArgs)
myNewsGroup.CurrentPageIndex = e.NewPageIndex
BindList()
End Sub
...全文
24 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
edobnet 2003-09-15
  • 打赏
  • 举报
回复
/// <summary>
/// 获取用于分页的SQL语句
/// </summary>
/// <param name="unitSql">原子SQL</param>
/// <param name="keyField">关键列,应该能唯一确定一条记录</param>
/// <param name="currentPage">要显示的页面编号</param>
/// <param name="pageSize">每页显示记录数</param>
/// <returns>目标SQL</returns>
public string GetPageingSql(string unitSql, string keyField, int currentPage, int pageSize)
{
string sql;
sql = "select * from (select top " + pageSize.ToString() + " * from ( select top " + (currentPage + 1) * pageSize +
" * from ( " + unitSql + " ) PageingTable1 order by " + keyField +
" ) PageingTable2 order by " + keyField.Replace(",", " desc ,") + " desc ) PageingTable3 order by " + keyField;
return sql;
}

/// <summary>
/// 设置导航对象的目标DataGrid以及针对DataGrid的数据邦定事件
/// </summary>
/// <param name="adg">DataGrid对象</param>
/// <param name="aBindData1">数据邦定事件</param>
public void SetTarget(DataGrid adg, BindCustomDataDelegate aBindData1)
{
curDataPageType = DataPageType.PageData;
BindData2 = aBindData1;
BindEvent(adg);
}

public void SetTarget(DataGrid adg, BindDataDelegate aBindData1)
{
curDataPageType = DataPageType.AllData;
BindData1 = aBindData1;
BindEvent(adg);
}

private void BindEvent(DataGrid adg)
{
_dg = adg;

//邦定事件
btnNavFirst.Click += new System.EventHandler(this.NavigationButtonClick);
btnNavPrevious.Click += new System.EventHandler(this.NavigationButtonClick);
btnNavNext.Click += new System.EventHandler(this.NavigationButtonClick);
btnNavLast.Click += new System.EventHandler(this.NavigationButtonClick);
btnNavGo.Click += new System.EventHandler(this.NavigationButtonClick);
_dg.DataBinding += new System.EventHandler(this.zxDataBinding);
}

/// <summary>
/// 设置DataGrid样式
/// </summary>
/// <param name="aPageSize">每页显示行数</param>
/// <param name="aAutoHidden">是否自动隐藏</param>
/// <param name="aDispStyle">显示风格,1:标准型,2:精简型</param>
public void SetStyle(int aPageSize, bool aAutoHidden, int aDispStyle)
{
_pagesize = aPageSize;
_autohidden = aAutoHidden;//aAutoHidden;所有DataGrid都设置成自动隐藏
_dispStyle = aDispStyle;

divPanel.Visible = !aAutoHidden;

_dg.AllowPaging = true;
_dg.AllowCustomPaging = false;
_dg.PagerStyle.Visible = false;
_dg.PageSize = _pagesize;
_dg.PagerStyle.Mode = PagerMode.NumericPages;
_dg.PagerStyle.HorizontalAlign = HorizontalAlign.Right;
}

public void SetStyle(int aPageSize, bool aAutoHidden)
{
SetStyle(aPageSize, aAutoHidden, 1);
}

public void SetStyle(int aPageSize)
{
SetStyle(aPageSize, true);
}
#region Web Form Designer generated code
override protected void OnInit(EventArgs e)
{
//
// CODEGEN:该调用是 ASP.NET Web 窗体设计器所必需的。
//
InitializeComponent();
base.OnInit(e);
}

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

}
#endregion

/// <summary>
/// 导航按钮点击事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void NavigationButtonClick(object sender, System.EventArgs e)
{
string direction = ((LinkButton)sender).CommandName;
int currentPageIndex, pageCount;

currentPageIndex = int.Parse(this.hdCurrentIndex.Value);//_dg.CurrentPageIndex;
pageCount = this.ItemCount / _dg.PageSize + 1;//_dg.PageCount;

//根据按键不同,到达不同的目标页
switch (direction.ToUpper())
{
case "FIRST" :
currentPageIndex = 0;
break;
case "PREVIOUS" :
currentPageIndex = Math.Max(currentPageIndex -1, 0);
break;
case "NEXT" :
currentPageIndex = Math.Min(currentPageIndex + 1, pageCount - 1);
break;
case "LAST" :
currentPageIndex = Math.Max(pageCount - 1, 0);
break;
case "GO" :
try
{
currentPageIndex = Math.Min(pageCount - 1, int.Parse(tbPage.Text) - 1);
tbPage.Text = "";
}
catch
{
tbPage.Text = "";
}
break;
default :
break;
}


if(curDataPageType == DataPageType.AllData)
_dg.CurrentPageIndex = currentPageIndex;

this.hdCurrentIndex.Value = currentPageIndex.ToString();

if(BindData1 != null)BindData1();
if(BindData2 != null)BindData2(currentPageIndex);
}

/// <summary>
/// DataGrid数据邦定前,设置导航条
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void zxDataBinding(object sender, System.EventArgs e)
{
int newCount = 0;
int PageCount = 0;
int currentPageIndex = int.Parse(this.hdCurrentIndex.Value);//_dg.CurrentPageIndex;


if (_dg.DataSource == null)
{
SetButtonState(0);
return;
}

//如果是分页数据,直接取总记录数,否则,从数据源取得
if(curDataPageType == DataPageType.PageData)
{
newCount = this.ItemCount;
}
else
{
if (_dg.DataSource.GetType().ToString().ToLower() == "system.data.datatable")
{
newCount = ((DataTable)_dg.DataSource).Rows.Count;
}
else if(_dg.DataSource.GetType().ToString().ToLower() == "system.data.dataview")
{
newCount = ((DataView)_dg.DataSource).Count;
}
else if(_dg.DataSource.GetType().ToString().ToLower() == "system.data.dataset")
{
newCount = ((DataSet)_dg.DataSource).Tables[0].Rows.Count;
}

hdRowCount.Value = newCount.ToString();
}

//数据邦定时判断,当前页是否越界
if(newCount > 0)
{
PageCount = (int)((newCount - 1) / _pagesize + 1);
if(currentPageIndex > PageCount - 1)currentPageIndex = PageCount - 1;
}
else
{
PageCount = 0;
currentPageIndex = 0;
}

//显示风格
switch (_dispStyle)
{
case 2:
LabelMsg.Text = "共" + PageCount.ToString() + "页 第" + (currentPageIndex + 1).ToString() + "页";
LabelMsg.Text += " 总记录数:" + newCount.ToString() + "";
break;
case 1:
tbPage.Text=(currentPageIndex + 1).ToString();
LabelMsg.Text = "共 "+ PageCount.ToString() + " 页";
LabelMsg.Text += " 共 " + newCount.ToString()+" 条记录";
break;
}

//是否自动隐藏
if (_autohidden)
{
divPanel.Visible = ((newCount - 1) / _pagesize > 0);
}
else
{
divPanel.Visible = true;
}

//设置按钮状态
SetButtonState(PageCount);

if(curDataPageType == DataPageType.AllData)
{
_dg.CurrentPageIndex = currentPageIndex;
}
this.hdCurrentIndex.Value = currentPageIndex.ToString();
}

/// <summary>
/// 设置导航按钮是否可用的状态
/// </summary>
/// <param name="_PageCount">总页数</param>
private void SetButtonState(int _PageCount)
{
int currentPageIndex;

currentPageIndex = int.Parse(this.hdCurrentIndex.Value);

btnNavFirst.Enabled = (currentPageIndex > 0);
btnNavPrevious.Enabled = (currentPageIndex > 0);
btnNavNext.Enabled = (currentPageIndex < _PageCount - 1);
btnNavLast.Enabled = (currentPageIndex < _PageCount - 1);
}

}
}
}
edobnet 2003-09-15
  • 打赏
  • 举报
回复
dgNavigation.ascx.cs文件,别人写的,我也改了一下!
/*************************************************************************************
*
* 数据分页控件
*
* 使用说明:
* dgNavigation 的摘要说明。
* 1.将dgNavigation.ascx控件拖入网页,比如命名为:DgNavigation1
* 2.在服务器代码中加入对控件命名空间的引用:
* using Tianyu.WebControl;
* 3.在服务器代码中加入对它的声明:
* protected dgNavigation DgNavigation1;
*
* 4.在网页的Page_Load事件中加入(下面代码每次都要执行,所以不要加在!IsPostBack中):
* DgNavigation1.SetTarget(DataGrid1, new BindDataDelegate(BindData));//BindData是你的数据邦定事件
* DgNavigation1.SetStyle(10, true);//10表示每页分10行,true表示无分页时自动隐藏
*
*
* 2003-07-07 修改说明
* 增加仅提取当前页数据功能
* 使用方法:
* 1.同以前的摘要说明一样,不过设置目标对象有所不同:
* DgNavigation1.SetTarget(DataGrid1, new BindCustomDataDelegate(BindData));//BindData是你的数据邦定事件
* 2.定义一数据邦定方法:
* private void BindData(int curPage)
* 3.在此方法中,用dgNavigation.GetCountSql()得到取结果集行数的SQL
* 4.取出总行数,并赋给DgNavigation1.ItemCount
* 5.用DgNavigation1.GetPageingSql()得到分页的SQL
* 实例:
* private void BindData(int curPage)
* {
* SqlConnection conn = new SqlConnection(m_ConnectionString);
* SqlCommand comm = new SqlCommand(this.DgNavigation1.GetCountSql("select * from employee_hist "), conn);
* conn.Open();
* this.DgNavigation1.ItemCount = (int)comm.ExecuteScalar();
* comm.CommandText = this.DgNavigation1.GetPageingSql("select * from employee_hist ", "accountid, batchno ,PID ", curPage, 50);
* SqlDataAdapter m_Adapter = new SqlDataAdapter(comm);
* DataTable dt = new DataTable();
* m_Adapter.Fill(dt);
* this.DataGrid1.DataSource = dt;
* DataGrid1.DataBind();
* }
*
* 另:使用这种方法后,页面可以关闭Page.EnableViewState属性
*
*
* 作者:netcolorwolf 2002-08-03
*
*********************************************************************************** */

namespace Tools
{
namespace WebControl
{

using System;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;

public delegate void BindDataDelegate();
public delegate void BindCustomDataDelegate(int currentPage);

/// <summary>
/// 用于实现数据分页的用户控件
/// </summary>
public abstract class dgNavigation : System.Web.UI.UserControl
{

public BindDataDelegate BindData1;
public BindCustomDataDelegate BindData2;

private DataGrid _dg;//目标Grid
private bool _autohidden = true;//自动隐藏
private int _pagesize = 10;//缺省分页数
protected System.Web.UI.WebControls.Label LabelMsg;
protected System.Web.UI.WebControls.LinkButton btnNavLast;
protected System.Web.UI.WebControls.LinkButton btnNavNext;
protected System.Web.UI.WebControls.LinkButton btnNavPrevious;
protected System.Web.UI.WebControls.LinkButton btnNavFirst;
protected System.Web.UI.WebControls.TextBox tbPage;
protected System.Web.UI.WebControls.LinkButton btnNavGo;
protected System.Web.UI.WebControls.Panel divPanel;//每页显示行数
private int _itemcount = 0;
protected System.Web.UI.HtmlControls.HtmlInputHidden hdCurrentIndex;//DagaGrid 当前页
protected System.Web.UI.HtmlControls.HtmlInputHidden hdRowCount;//数据总数
private int _dispStyle = 1;//显示风格
enum DataPageType {AllData, PageData};//数据分页类别,提取所有数据 或者 提取当前页数据
private DataPageType curDataPageType;//当前数据分页类别

public DataGrid Target
{
get { return _dg; }
set { _dg = value;}
}

public bool AutoHidden
{
get { return _autohidden; }
set { _autohidden = value;}
}

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

public int ItemCount
{
get { return int.Parse(this.hdRowCount.Value); }
set { _itemcount = value; hdRowCount.Value = value.ToString();}
}

private void Page_Load(object sender, System.EventArgs e)
{

}

/// <summary>
/// 获取原子SQL会返回的结果行总数
/// </summary>
/// <param name="unitSql">原子SQL</param>
/// <returns>目标SQL</returns>
public string GetCountSql(string unitSql)
{
string sql;
sql = "select count(*) from (" + unitSql + " ) CountTable ";

return sql;
}
edobnet 2003-09-15
  • 打赏
  • 举报
回复
dgNavigation.ascx文件
<%@ Control Language="c#" AutoEventWireup="false" Codebehind="dgNavigation.ascx.cs" Inherits="Tools.WebControl.dgNavigation" TargetSchema="http://schemas.microsoft.com/intellisense/ie5" %>
<asp:panel id="divPanel" HorizontalAlign="Center" Width="100%" runat="server" Visible="False" EnableViewState="False">
<asp:LinkButton id="btnNavFirst" runat="server" Text="第一页" CommandName="FIRST" CausesValidation="False" ToolTip="跳转到第一页">[第一页]</asp:LinkButton>
<asp:LinkButton id="btnNavPrevious" runat="server" Text="上一页" CommandName="PREVIOUS" CausesValidation="False" ToolTip="跳转到上一页">[上一页]</asp:LinkButton>
<asp:LinkButton id="btnNavNext" runat="server" Text="下一页" CommandName="NEXT" CausesValidation="False" ToolTip="跳转到下一页">[下一页]</asp:LinkButton>
<asp:LinkButton id="btnNavLast" runat="server" Text="最后一页" CommandName="LAST" CausesValidation="False" ToolTip="跳转到最后一页">[最后一页]</asp:LinkButton>   第
<asp:TextBox id="tbPage" runat="server" Width="25px" ToolTip="输入要跳转的页码"></asp:TextBox>页 
<asp:LinkButton id="btnNavGo" runat="server" Text="[跳转]" CommandName="GO" CausesValidation="False" ToolTip="跳转到指定页">[跳转]</asp:LinkButton>
<asp:Label id="LabelMsg" runat="server"></asp:Label>
<INPUT id="hdCurrentIndex" style="WIDTH: 39px; HEIGHT: 22px" type="hidden" size="1" value="0" name="Hidden1" runat="server">
<INPUT id="hdRowCount" style="WIDTH: 43px; HEIGHT: 22px" type="hidden" size="1" name="Hidden1" runat="server"></asp:panel>

62,041

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧