我不想通过JS实现,就是要让他刷新,不然分页有什么意义
用什么来实现不是我想讨论的问题我现在想讨论的问题是为什么动态生成的控件没有在页面里出现,而不是讨论怎样做分页
我发现即时把那段放在Pager()里,控件是确实生成了的,只是在页面里不见了
因为我通过遍历this.Contrls输出控件属性能遍历到该控件的存在,但它为什么就是不出现呢?
用什么来实现不是我想讨论的问题我现在想讨论的问题是为什么动态生成的控件没有在页面里出现,而不是讨论怎样做分页
我发现即时把那段放在Pager()里,控件是确实生成了的,只是在页面里不见了
因为我通过遍历this.Contrls输出控件属性能遍历到该控件的存在,但它为什么就是不出现呢?
改成this.Page.Controls.Add(sss);就报以下错误
集合已修改;可能无法执行枚举操作。
异常详细信息: System.InvalidOperationException: 集合已修改;可能无法执行枚举操作。改成 this.Parent.Controls.Add(sss);就抛出如下HttpException异常
控件包含代码块(即 <% ... %>),因此无法修改控件集合。
上面就是原因;
如果想实现要得功能,可以换一种思路;
那就是把你需要动态生成的控件提前生成出来,不过把它的visable属性设置为false
因为这是由调用时用户给参数的赋值决定的
比如类似以下样子的
<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控件的个数啊
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);
}
}
<%MyPager1.Pager();%>感觉有问题....
1.不能放到页面的PageLoad里面,因为这样虽然有控件显示出来,但是显示到页面最顶部了,不在需要的位置
2.不能放在控件的PageLoad里面,因为此时控件的一些关键属性尚未赋值,这样会执行出错
我实在是想不出什么办法了哦,对了,一个朋友的话有点道理,他说这样之所以没显示出来是因为,这个控件实例是在一个函数里的,作用域是函数内部,那么(无论哪种语言),当函数执行完毕它就被销毁了,所以,它只是曾经出现过却后来又消失了。
我觉得很有道理,于是想到一个办法,在类里声明一个控件数组,然后在函数里把控件数组中的控件初始化,这样他将不会被销毁,因为它属于类而不是函数,但是发现行不通,因为声明数组时要写明元素个数,这正是有待赋值的关键参数之一。大家想想有什么办法呢?
只要你在Begin Render前添加的控件都可以呈现的.
一个用户控件,有一个参数n,由用户赋值,n等于多少就在指定位置输出多少个HyperLink
要支持Control1.n=4这样的赋值
谁能实现??
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" />
因为它写在用户控件的PageLoad事件里,那么这个传入参数也必须在控件里写出
如果赋值语句写在这个的上方,则赋值的时候这个实例还没创建,出错
如果赋值语句写在这个的下方,则赋值根本对控件的显示不起任何作用
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);
不是我偏,你想想啊,做一个控件像这样的灵活性应该是最基本的
既然要提供一个属性,就应该要支持以"控件ID.属性=值"的方式赋值.
如果这点都不支持,那使用上的局限性也太大了吧?可复用性也太差了吧?另一方面,从需求的角度来说也需要可以这样赋值,因为这一个控件便有十来个参数
如果不支持那种赋值,会大大降低程序的可读性,想想一个控件的尖括号里写一大堆...
如果是错的,那岂不是VS出错了?
你看HyperLink控件,如果你说"实例名称.属性"的用法是错误的话,下面这段也是错误的了
HyperLink sss = new HyperLink();
sss.Text = "~~~~~~~~~~~~~~~~~~~~~~~~~~~~";
sss.ID = "sasd";
sss.Visible = true;