我用DataGrid显示数据分页,当前是第三页的时候,我点击一个记录进行操作,操作完后返回,如何让datagrid显示的还是第3页记录啊。

解决方案 »

  1.   

    可以考虑ViewState和Request.QueryString结合.
    ViewState["PageNum"]保存当前页码.
    操作的时候该页码通过?pageNum 传递过去.
    操作完毕后把pageNum再传递回来给ViewState["PageNum"]
    ViewState["PageNum"]再给CurrentPageIndex
      

  2.   

    用Session传个参数过去,再传回来
    偶只知道用Session传,初学者而已,不过似乎大家都建议不要用Session
      

  3.   

    newsManage.aspx(1)和newsEdit.aspx(2)1.在(1)的newsManage.aspx.cs页面里加入ViewState["PageNum"]它用来存储当前页码.
    第一次打开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环境,没办法试.
      

  4.   

    其实这个问题涉及数据和位置(页码),在页面转移后应保存在那里?
    1、位置(页码),数字一个,可以用session()保存在服务器,也可以用viewstate保存在客户端(页面),其实都差不多。
    2、关键是数据如果处理,
      1)可以用session保存在内存中,优点是速度快,缺点是占用服务器内存(如果数据量大或用户多,服务器物理内存不够,写到虚拟内存,那速度快的优点就没有了。),另一缺点是数据没有更新。
      2)根据页码重新到数据库中查询。
    如何处理要视乎你的数据量和并发用户数量来衡量。
      

  5.   

    楼主参考一下:我做的实现了的页面,删除和修改返回后保持页面状态.
    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('确实要删除吗?');");
    }
    }
    }
    }
      

  6.   

    <%@ Page language="c#" Codebehind="MMManage.aspx.cs" AutoEventWireup="false" Inherits="MMTest.MMManage" %>
    <!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>
      

  7.   

    MakeUrl 形成<a href="MMEdit.aspx?id=...&page=...">....</a>的href.
    编辑保存返回的时候注意要把传递过去的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,这时候就会有问题了.
    ------------------------------------
    我的仅能参考,更好的方式我没想出来........
      

  8.   

    我做过,是这样的,用viewstate保存页码,不要用redirect 会出现问题,用response.write出location=。来实现,然后在pageload判断当前页码是不是大于pagecount,是的话就减1,因为有可能你删除了数据!
      

  9.   

    然后在pageload判断当前页码是不是大于pagecount,是的话就减1
    -----------------------
    有些怀疑,pagecount是上一次绑定的结果,其值与删除后的数量应该是不一样的。这样判断有问题。
    我说的是自动分页。
      

  10.   

    怎么会  你回传了会重新绑定的=====================================
    在数据绑定之前,如何获得PageCount?数据绑定之后才能确定PageCount,
    而绑定之前要确定当前页码啊,判断当前页码是否合法,又如何把当前页和PageCount 比较?