我做了一用户控件,控件的功能就是生成"<a href=本页?page=x+1>上一页</a> <a href=本页?page=x-1>下一页</a>"这种html代码,在页面显示.
可是我放进应用页面,运行起来,一点击它翻页的时候,页面的状态全部被清掉了, 等于页面是第一次打开一样,怎么解决啊?

解决方案 »

  1.   

    “可是我放进应用页面”,这个“放进”是关键!写在设计器(aspx或者ascx中)的控件,每一次装载页面的时候都预先被装入,也就是在PageLoad事件之前早已经被装入。你自己写的控件,是何时装入页面控件树的呢?在页面回发的时候,你设断点跟踪一下,到底是什么时候装入的呢?
      

  2.   

    "<a href=本页?page=x+1>上一页</a> <a href=本页?page=x-1>下一页</a>"翻页的时候不是到了新的一个页面,ViewState不是针对页面的吗?那肯定没有了。
      

  3.   

    注意写用户控件的Page_Load事件中的内容,很可能是你自己清掉的
      

  4.   

    我得页面是这样的: 也就是很常见得那种查询页面,最上面是几个查询下拉控件,中间是显示查询结果的
    的datagrid,datagrid下面就是我的控件,负责显示"上一页下一页"的内容,当我点击控件上的翻页链接的时候,页面被重新加载,那几个查询控件的内容又回复到初始状态,而查询的结果就是根据查询控件生成的,结果datagird显示的页数虽然对,但内容却总是默认的查询结果.我的page_oad里只有一个方法,就是根据查询控件的值,生成一个datagird显示,和我的分页显示.问题是当点击翻页链接"href=xxx.aspx?page=n"(假设当前页名为xxx.aspx),页面就被初始化了,何让我的那些查询控件,(就是几个WebControls,2个dropdownlist,1个日历控件)保持原来的状态?
      

  5.   

    If PH.EnableViewState = True Then
                Dim pageList As New ArrayList
                pageList = SgetVisiblePage(lbl_xiangmubianhao.Text)
                initialComponent(pageList)
                loadprojectname()        End If
    我这个是动态生成控件的代码,ph是容器,对你可能有些帮助
      

  6.   

    If PH.EnableViewState = True Then
                Dim pageList As New ArrayList
                pageList = SgetVisiblePage(lbl_xiangmubianhao.Text)
                initialComponent(pageList)
                loadprojectname()        End If
    我这个是动态生成控件的代码,ph是容器,对你可能有些帮助
      

  7.   

    是不是你的page_load事件里面的问题有些东西得放在!IsPostBack里面
      

  8.   

    href=xxx.aspx?page=n
    --------------------------------
    这再明白不过了。早期“翻页”程序把这种方法当作标准。这种翻页,其实是重新开始一个新页面,只不过把Datagrid的初始化参数传过去,其它页面上控件上的当前是什么参数完全没有管。更明确一点,如果datagrid有排序表达式(通常早AllowSort=true的时候点击标题),那么所谓的“翻页”也不能保持这个表达式。仅datagrid就有几十个需要保存在ViewState中的信息,你那种“翻页”究竟保持了几个?只有一个!所以,我曾经在帖子里把这种datagrid叫做“恶俗”的设计,目的就是提醒大家一定要对最基本的交互性设计知识有个概念,编程时凭第一反应就知道什么设计可行什么不可行。你应该对这类型的页面刷新方法深恶痛绝,之后就会认真地使用ViewState机制。
      

  9.   

    ViewState机制的目的:页面在提交时,会对页面上所有用户改动的内容、以及一个隐藏字段__ViewState中保存的页面所有状态重新发送回服务器,服务器会重建页面并且将状态回填给所有控件,之后引发各种控件的changed、click或者用户编程自定义的postBack事件。
      

  10.   

    那我用什么办法 可以在点 翻页的时候 使用ViewState机制实现页面的刷新?
      

  11.   

    href="javascript:GoPager(2);"在GoPager中可以点击一个服务器生成的按纽function GoPager(iPage)
    {
        document.all..hidPageIndex.value = iPage;
        document.all.btnPager.click();
    }
      

  12.   

    给你在线写个控件(仅示例)public class DataGridPageNav
      inherits webcontrolprivate withevent GoPrev,GoNext as buttonProtected Overrides Sub CreateChildControls()
      goprev=new button
      goprev.text="向前"
      gonext=new button
      gonext.text="向后"
    End Subpublic event GoPrevClicked
    public event GoNextClickedPrivate Sub GoPrev_Click(ByVal sender As Object, ByVal e As System.EventArgs)
      Handles GoPrev.Click
      raiseevent GoPrevClicked
    end subPrivate Sub GoNext_Click(ByVal sender As Object, ByVal e As System.EventArgs)
      Handles GoNext.Click
      raiseevent GoNextClicked
    end subend class
      

  13.   

    当然也可以不把这个事情委派给事件,而是提供一个参数获得外界传来的DataGrid对象,然后在那两个方法中去改变它的CurrentPageIndex。
      

  14.   

    少了两句:Protected Overrides Sub CreateChildControls()
      goprev=new button
      me.controls.add goprev
      goprev.text="向前"
      gonext=new button
      me.controls.add gonext
      gonext.text="向后"
    End Sub
      

  15.   

    谢谢各位的指点,实在没办法,我只好用linkbutton取代原来的html代码<a href='xx.aspx'>下一页</a>
    改成响应linkbutton的点击事件,经过一天一夜的奋斗,也因此做成了一个不错的比较通用的翻页控件,呵呵,调用时候方便得很.我的翻页控件是跟数据无关的,调用的时候只需传一个总记录数(也可自定义页数pagesize),再加上一个处理翻页事件的方法就ok了.但我稍嫌美中不足的是它是个用户控件,源码都可以看到,我想改成一个web服务器控件,就是生成一个dll的那种,可是让我迷惑的是,在web项目下编写web自定义控件没有可视化界面,我的的那些linkbutton和label都不知道怎么摆上去,继续请教各位
      

  16.   

    我上面不是有源码吗?不就是把button类换为linkbutton吗?
      

  17.   

    6761675 我建的一个群,欢迎大家加入。
    专门研究asp.net的实用技巧、经验,服务器控件等 。