我用DataGrid显示数据分页,当前是第三页的时候,我点击一个记录进行操作,操作完后返回,如何让datagrid显示的还是第3页记录啊。
解决方案 »
- 关于分布式事务的奇怪问题
- GRIDVIEW + SqlDataSource 的根据ID删除某行的问题。
- 问个群组系统的问题 请大家一起来讨论一下 在线 分不多
- 有用过Microsoft Web Application Stress的吗?
- 如何用编程的方式打开windows验证的站点?
- FTP网络空间问题
- 请问.Net中的SourceSafe是干啥用的?2003中有吗?我在2005中看到了,可是在2003中找不到。
- 水晶报表显示问题???
- webmatrix打开*.aspx后不能显示原来的汉字
- 表单保存不覆盖数据的问题.
- 100分,求关于新建asp.net项目的问题,在线等
- ASP网上投票系统大多是绑定IP的,朋友托我代理投票,我也想不出好办法,只能求大家多帮忙顶一下了,万分感谢!
ViewState["PageNum"]保存当前页码.
操作的时候该页码通过?pageNum 传递过去.
操作完毕后把pageNum再传递回来给ViewState["PageNum"]
ViewState["PageNum"]再给CurrentPageIndex
偶只知道用Session传,初学者而已,不过似乎大家都建议不要用Session
第一次打开ViewState["PageNum"]=0(第一页)
在页码更改的事件里给它赋值Page.CurrentPageIndex=ViewState["PageNum"].ToString()
在打开(2)进行编辑的链接出生成象下面的东东:(2)?newsid=12&pageNum = ViewState["PageNum"].ToString()
2.这样打开(2)的时候在(2)中获得pageNum: string pageNow = Request.QuerSting["pageNum"];
(2)操作完毕的时候要返回(1):(1)?pageNum = 刚才得到的页码.
3.这样返回(1)后判断Request.QuerSting["pageNum"]是否为null若不是则表示是编辑之后的返回
ViewState["PageNum"]=Request.QuerSting["pageNum"]当前页码设置为ViewState["PageNum"]这样就可以保持了.
我这里没有.net环境,没办法试.
1、位置(页码),数字一个,可以用session()保存在服务器,也可以用viewstate保存在客户端(页面),其实都差不多。
2、关键是数据如果处理,
1)可以用session保存在内存中,优点是速度快,缺点是占用服务器内存(如果数据量大或用户多,服务器物理内存不够,写到虚拟内存,那速度快的优点就没有了。),另一缺点是数据没有更新。
2)根据页码重新到数据库中查询。
如何处理要视乎你的数据量和并发用户数量来衡量。
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;namespace MMTest
{
/// <summary>
/// MMManage 的摘要说明。
/// </summary>
public class MMManage : System.Web.UI.Page
{
protected System.Web.UI.WebControls.DataGrid DgManage;
ClassConn connE = new ClassConn();//实例化数据访问类 private void Page_Load(object sender, System.EventArgs e)
{
// 在此处放置用户代码以初始化页面
if (ViewState["CurrentPage"] ==null)
{
ViewState["CurrentPage"] ="0";
}
if (!IsPostBack)
{
//初始化当前页码:
ViewState["CurrentPage"] = Request.QueryString["page"] == null ? "0" : Request.QueryString["page"].ToString();
//数据绑定
BindData();
}
}
/// <summary>
/// 数据绑定
/// </summary>
private void BindData()
{
string strSql = "select * from MMS_SUBMIT order by id desc";
DataSet ds = new DataSet();
ds = connE.getDs(strSql);
DgManage.DataSource = ds;
int pageNow = int.Parse(ViewState["CurrentPage"].ToString());
//if (pageNow> DgManage.PageCount-1 || pageNow<0) pageNow =0;
DgManage.CurrentPageIndex = pageNow;
try
{
DgManage.DataBind();
}
catch
{
pageNow = 0;
ViewState["CurrentPage"] = "0";
DgManage.CurrentPageIndex = pageNow;
DgManage.DataBind();
}
}
//生成编辑的URL
protected string MakeUrl (object obj)
{
//string Url = string.Format("MMEdit.aspx?id={0}&page={1}",obj.ToString(),ViewState["CurrentPage"].ToString());
string Url = "MMEdit.aspx?id="+obj.ToString();
Url += "&page="+ViewState["CurrentPage"].ToString();
return Url;
} #region Web 窗体设计器生成的代码
override protected void OnInit(EventArgs e)
{
//
// CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
//
InitializeComponent();
base.OnInit(e);
}
/// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
/// </summary>
private void InitializeComponent()
{
this.DgManage.PageIndexChanged += new System.Web.UI.WebControls.DataGridPageChangedEventHandler(this.DgManage_PageIndexChanged);
this.DgManage.DeleteCommand += new System.Web.UI.WebControls.DataGridCommandEventHandler(this.DgManage_DeleteCommand);
this.DgManage.ItemDataBound += new System.Web.UI.WebControls.DataGridItemEventHandler(this.DgManage_ItemDataBound);
this.Load += new System.EventHandler(this.Page_Load); }
#endregion
/// <summary>
/// DgManage_PageIndexChanged
/// </summary>
/// <param name="source"></param>
/// <param name="e"></param>
private void DgManage_PageIndexChanged(object source, System.Web.UI.WebControls.DataGridPageChangedEventArgs e)
{
//DgManage.CurrentPageIndex = e.NewPageIndex ;
ViewState["CurrentPage"] = e.NewPageIndex.ToString();
BindData();
}
/// <summary>
/// 删除单个记录
/// </summary>
/// <param name="source"></param>
/// <param name="e"></param>
private void DgManage_DeleteCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
{ string strSql = "delete from MMS_SUBMIT where id ="+e.Item.Cells[1].Text.ToString();
//string strSql = "delete from MMS_SUBMIT where id ="+DgManage.DataKeys[e.Item.ItemIndex].ToString();
connE.runSqlOnly(strSql);
BindData();
} /// <summary>
/// 生成删除的确认事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void DgManage_ItemDataBound(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)
{
LinkButton lbtn = (LinkButton) e.Item.FindControl("lbtnDel");
if (lbtn != null)
{
lbtn.Attributes.Add("onclick","return confirm('确实要删除吗?');");
}
}
}
}
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<HTML>
<HEAD>
<title>MMManage</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">
<LINK href="adminCss.css" type="text/css">
</HEAD>
<body MS_POSITIONING="FlowLayout">
<form id="Form1" method="post" runat="server">
<FONT face="宋体">
<TABLE class="main" id="Table1" width="100%">
<TR>
<TD></TD>
<TD>查看彩信</TD>
<TD></TD>
</TR>
<TR>
<TD></TD>
<TD><asp:datagrid id="DgManage" runat="server" AllowPaging="True" AutoGenerateColumns="False" Width="100%"
DataKeyField="ID">
<Columns>
<asp:TemplateColumn HeaderText="选择">
<ItemTemplate>
<asp:CheckBox ID="CbxSel" Runat="server"></asp:CheckBox>
</ItemTemplate>
</asp:TemplateColumn>
<asp:BoundColumn Visible="False" DataField="id"></asp:BoundColumn>
<asp:TemplateColumn HeaderText="标题">
<ItemTemplate>
<asp:HyperLink ID ="HlkEdit" Runat ="server" NavigateUrl='<% # MakeUrl(DataBinder.Eval(Container.DataItem,"id"))%>' Text ='<% # DataBinder.Eval(Container.DataItem,"subject")%>'>
</asp:HyperLink>
</ItemTemplate>
</asp:TemplateColumn>
<asp:TemplateColumn HeaderText="删除">
<ItemTemplate>
<asp:LinkButton ID="lbtnDel" Runat="server" text="删除" CommandName="Delete"></asp:LinkButton>
</ItemTemplate>
</asp:TemplateColumn>
</Columns>
<PagerStyle Mode="NumericPages"></PagerStyle>
</asp:datagrid></TD>
<TD></TD>
</TR>
<TR>
<TD></TD>
<TD></TD>
<TD></TD>
</TR>
</TABLE>
</FONT>
</form>
</body>
</HTML>
编辑保存返回的时候注意要把传递过去的page 再传回MMManage.aspx这样.列表页面根据返回的page的值确定显示第几页.
我个人觉得里面的问题:
1.什么时候更新ViewStae[CurrentPage]:第一次打开页面的时候把0赋给ViewStae[CurrentPage];当点击页码(1,2,3....)的时候;当编辑返回的时候;
2.再每次数据绑定前都要把ViewStae[CurrentPage]的值赋给DgManage.CurrentPageIndex ,这样能保证页面能保持问题.
3try
{
DgManage.DataBind();
}
catch
{
pageNow = 0;
ViewState["CurrentPage"] = "0";
DgManage.CurrentPageIndex = pageNow;
DgManage.DataBind();
}
这里当页码超出范围的时候,把默认的页码赋给0.即第一页;如删除了第四页的最后一条记录的时候,返回的仍然是3,这时候就会有问题了.
------------------------------------
我的仅能参考,更好的方式我没想出来........
-----------------------
有些怀疑,pagecount是上一次绑定的结果,其值与删除后的数量应该是不一样的。这样判断有问题。
我说的是自动分页。
在数据绑定之前,如何获得PageCount?数据绑定之后才能确定PageCount,
而绑定之前要确定当前页码啊,判断当前页码是否合法,又如何把当前页和PageCount 比较?