我网上找了个方法,但是会有问题,时间长了触发事件的时候会有问题
方法如下: public bool SubControlsCreated = false;
private void Page_Load(object sender, System.EventArgs e)
{ if (!SubControlsCreated)
{
CreateRow(Table1,Table2);
}
//*如果是可编辑的,才调用js
}
public void CreateRow(Table Table1,Table Table2)
{ //这里动态创建控件并可加入时间 ............创建控件并加入事件
SubControlsCreated=true;
}
public bool SubControlsCreated
{
get
{
object o = ViewState["SubControlsCreated"];
if (o == null)
return false;
else
return (bool)o;
}
set
{
ViewState["SubControlsCreated"] = value;
}
}
这个逻辑是这样的:当页面装载的时候,动态子控件还没有装载,所以SubControlsCreated 永远为false,在page_load中装载了子控件之后(其实为了防止在page_load之前已经装载好,所以才检测这个bool值),asp.net会自动回复上次子控件内部所有控件的上次页面输出时最后的状态值,并且准备触发其事件。然后,当某个事件或者方法的执行结果会造成子控件需要清除并重新产生,就会再次设置它为false。再PreRender的时候,检测这个bool值,如果需要重新装载则调用CreateRow重新装载。你的程序不会导致你所说的问题。你说“时间长了”就会造成什么事件问题呢?你一点也没有说明白。
{
if (!SubControlsCreated) { CreateRow(Table1,Table2); }
}private void CreateRow(Table Table1,Table Table2)
{
//这里先将PlaceHolder等目标容器内清空,既 xxxx.Controls.Clear()
//这里动态创建控件并可加入事件
SubControlsCreated=true;
}private void Page_PreRender(object sender, System.EventArgs e)
{
if (!SubControlsCreated) { CreateRow(Table1,Table2); }
}当然你要确保Page_Load和Page_PreRender两个都被正确注册。通常Page_Load会自动被页面注册(如果AutoEventWireup="true")。也许,再codebehind代码中,需要在对象的实例化方法中写上注册 Page_PreRender方法。
时间长了触发事件的时候会有问题
================================一般是由于你所创建的控件的对象的引用已经出了生命周期(也就是说由于某个函数的结束,所以你的对象的引用就被销毁了,那些对象迟早会被回收)。建议你在类一级声明这个控件,但可以在方法中动态地创建它,这样就可以避免回收的问题了
楼上的这位说的是正解,再测试一下,如果没问题,结贴