我不想通过JS实现,就是要让他刷新,不然分页有什么意义
用什么来实现不是我想讨论的问题我现在想讨论的问题是为什么动态生成的控件没有在页面里出现,而不是讨论怎样做分页
我发现即时把那段放在Pager()里,控件是确实生成了的,只是在页面里不见了
因为我通过遍历this.Contrls输出控件属性能遍历到该控件的存在,但它为什么就是不出现呢?

解决方案 »

  1.   

    动态添加的控件是没有保存状态的,除非是在页面加载viewstate之前加载进来的。另外想通过this.Controls来遍历,该控件必须在控件树形成之前加进去,建议lz去看看页面生命周期应该会有帮助。
      

  2.   

    而且注意一点,页面执行时没有任何报错,是成功执行的,只是那个HyperText控件就像根本不存在一样而且动态生成控件的那段如果放在*.aspx.cs里页面是可以出现HyperText控件的而如果把那段放在ascx.cs里,并且把this.Controls.Add(sss);
    改成this.Page.Controls.Add(sss);就报以下错误
    集合已修改;可能无法执行枚举操作。
    异常详细信息: System.InvalidOperationException: 集合已修改;可能无法执行枚举操作。
    改成 this.Parent.Controls.Add(sss);就抛出如下HttpException异常
    控件包含代码块(即 <% ... %>),因此无法修改控件集合。
      

  3.   

    在page_load之前,加载控件状态和数据;在page_load方法执行完毕(注意是完毕),开始加载引起回发事件(就是点击了某个控件)的控件的状态和数据;所以你的控件显示不出来;
    上面就是原因;
    如果想实现要得功能,可以换一种思路;
    那就是把你需要动态生成的控件提前生成出来,不过把它的visable属性设置为false
      

  4.   

    但是在我的用户控件加载的时候,还是无法知道要生成多少个HyperText控件的
    因为这是由调用时用户给参数的赋值决定的
    比如类似以下样子的
    <jxy:MyPager ID="MyPager1" runat="server" />
    <%
    MyPager1.CountLeft = 2;
    MyPager1.CountRight =3;
    MyPager1.Pager();
    %>
    那么,在Page_Load()被调用的时候根本不知道要创建多少个HyperText控件,而只有下面赋值之后那些参数才有值,这样才知道——一共要生成2+3=5个控件,所以Page_Load()的时候是什么事都做不了的,那时所有参数都是空白的,所以用户控件的Page_Load()我是完全空白的,仅仅当一个重要参数被赋值时才调用PagerInit()事件准备好往外输出;但是我看到别人的Pager控件有的实现了由参数的值控制 HyperText控件的个数啊
      

  5.   

    真是见鬼了,这事太奇怪了,我把测试这个情况的代码全文发上来大家看看究竟什么原因
    Default.aspx
    <%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default" %>
    <%@ Register TagPrefix="jxy" TagName="MyPager" Src="~/MyPager.ascx" %>
    <%@ Import Namespace="System.Data" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml" >
    <head runat="server">
        <title>无标题页</title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
            <jxy:MyPager ID="MyPager1" runat="server" />
            <%MyPager1.Pager();%>
        </div>
        </form>
    </body>
    </html>Default.aspx.cs
    using System;
    using System.Data;
    using System.Configuration;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Web.UI.HtmlControls;public partial class _Default : System.Web.UI.Page 
    {
        protected void Page_Load(object sender, EventArgs e)
        {
        }
    }MyPager.ascx
    <%@ Control Language="C#" AutoEventWireup="true" CodeFile="MyPager.ascx.cs" Inherits="MyPager" %>MyPager.ascx.cs
    using System;
    using System.Data;
    using System.Configuration;
    using System.Collections;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Web.UI.HtmlControls;
    using System.Data.SqlClient;public partial class MyPager : System.Web.UI.UserControl
    {
        protected void Page_Load(object sender, EventArgs e)
        {
        }
        public void Pager()
        {
            HyperLink sss = new HyperLink();
            sss.Text = "~~~~~~~~~~~~~~~~~~~~~~~~~~~~";
            sss.ID = "sasd";
            sss.Visible = true;
            this.Controls.Add(sss);
        }
    }
      

  6.   

    这句
    <%MyPager1.Pager();%>感觉有问题....
      

  7.   

    因为MyPager1.Pager()是在控件树加呈现完了才执行.
      

  8.   

    那么这个事情应该怎么解决呢?
    1.不能放到页面的PageLoad里面,因为这样虽然有控件显示出来,但是显示到页面最顶部了,不在需要的位置
    2.不能放在控件的PageLoad里面,因为此时控件的一些关键属性尚未赋值,这样会执行出错
    我实在是想不出什么办法了哦,对了,一个朋友的话有点道理,他说这样之所以没显示出来是因为,这个控件实例是在一个函数里的,作用域是函数内部,那么(无论哪种语言),当函数执行完毕它就被销毁了,所以,它只是曾经出现过却后来又消失了。
    我觉得很有道理,于是想到一个办法,在类里声明一个控件数组,然后在函数里把控件数组中的控件初始化,这样他将不会被销毁,因为它属于类而不是函数,但是发现行不通,因为声明数组时要写明元素个数,这正是有待赋值的关键参数之一。大家想想有什么办法呢?
      

  9.   

    你可以了解一下控件树的生存周期.如果是在控件树已经呈现完成了再去添加控件那肯定是不行的.
    只要你在Begin Render前添加的控件都可以呈现的.
      

  10.   

    把问题简化一下就是谁会做像这样的效果
    一个用户控件,有一个参数n,由用户赋值,n等于多少就在指定位置输出多少个HyperLink
    要支持Control1.n=4这样的赋值

    谁能实现??
      

  11.   

    using System;
    using System.Data;
    using System.Configuration;
    using System.Collections;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Web.UI.HtmlControls;
    using System.Data.SqlClient;public partial class MyPager : System.Web.UI.UserControl
    {
        private int pager;
        protected void Page_Load(object sender, EventArgs e)
        {
            if(this.Pager == 4)
            {
              HyperLink sss = new HyperLink();
              sss.Text = "~~~~~~~~~~~~~~~~~~~~~~~~~~~~";
              sss.ID = "sasd";
              sss.Visible = true;
              this.Controls.Add(sss);
            }
        }
        public int Pager
        {
            set{
               pager = value;
            }
        }
    }
    调用
    <jxy:MyPager ID="MyPager1" runat="server" Pager="4" />
      

  12.   

    上面这个例子我早就实现了,关键就在于它不支持Control1.n=4这样的赋值
    因为它写在用户控件的PageLoad事件里,那么这个传入参数也必须在控件里写出
    如果赋值语句写在这个的上方,则赋值的时候这个实例还没创建,出错
    如果赋值语句写在这个的下方,则赋值根本对控件的显示不起任何作用
      

  13.   

    using System;
    using System.Data;
    using System.Configuration;
    using System.Collections;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Web.UI.HtmlControls;namespace WebApplication1
    {
        public partial class WebUserControl1 : System.Web.UI.UserControl
        {        
            protected void Page_Load(object sender, EventArgs e)
            {        }        public void AddContrl(int Pager)
            {
                for (int i = 0; i < Pager; i++)
                {
                    HyperLink sss = new HyperLink();
                    sss.Text = "~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ";
                    sss.ID = "sasd";
                    sss.Visible = true;
                    this.Controls.Add(sss);
                    Literal l = new Literal();
                    l.Text = "<br>";
                    this.Controls.Add(l);
                }
            }
            
        }
    }
    拖控件到頁面上,在需要的地方調用這個方法AddContrl(int Pager);
      

  14.   

    楼主的实现方法就有点偏了.如果一定要<% .. %>这种方式实现的话那你就还不如直接输入<a href=...></a>算了.自义定控件不是LZ想象的那么用的.
      

  15.   

    第19楼的说了等于没说,完全没有任何意义to 20楼:
    不是我偏,你想想啊,做一个控件像这样的灵活性应该是最基本的
    既然要提供一个属性,就应该要支持以"控件ID.属性=值"的方式赋值.
    如果这点都不支持,那使用上的局限性也太大了吧?可复用性也太差了吧?另一方面,从需求的角度来说也需要可以这样赋值,因为这一个控件便有十来个参数
    如果不支持那种赋值,会大大降低程序的可读性,想想一个控件的尖括号里写一大堆...
      

  16.   

    控件是灵活.但你那样调用方法根本就不正确的.从一个错误的方法入手.所做的一切肯定都是错误的.你得换做方法使现了.其实实现的方法很多.控件并不是万能的.也只是一个普通的类而已.最终的结果都是js+css+html.也是你要的结果.
      

  17.   

    那种调用方法是VS本身就提示我们这样做的,不信你在代码段里打入实例名称再加个点,出现的提示里面就有这些属性
    如果是错的,那岂不是VS出错了?
    你看HyperLink控件,如果你说"实例名称.属性"的用法是错误的话,下面这段也是错误的了
    HyperLink sss = new HyperLink(); 
    sss.Text = "~~~~~~~~~~~~~~~~~~~~~~~~~~~~"; 
    sss.ID = "sasd"; 
    sss.Visible = true;
      

  18.   

    你还是看一下控件的生命周期吧.还有.net框架结构.理解了就明白了.
      

  19.   

    http://www.cnblogs.com/oletan/archive/2008/11/04/1326587.html