我网上找了个方法,但是会有问题,时间长了触发事件的时候会有问题
方法如下: 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; 
}

解决方案 »

  1.   

    try
    public bool SubControlsCreated 
    {
      get
      {
    object o = ViewState["SubControlsCreated"];
    if (o == null)
    return false;
    else
    return (bool)o;
      }
      set
      {
    ViewState["SubControlsCreated"] = value;
      }
    }
      

  2.   

    代码没有问题。你的“CreateRow”方法一开始应该有代码把(如果存在的)已经装载过的子控件清除掉,以免重复装载。不过并不会导致你说的问题。
    这个逻辑是这样的:当页面装载的时候,动态子控件还没有装载,所以SubControlsCreated 永远为false,在page_load中装载了子控件之后(其实为了防止在page_load之前已经装载好,所以才检测这个bool值),asp.net会自动回复上次子控件内部所有控件的上次页面输出时最后的状态值,并且准备触发其事件。然后,当某个事件或者方法的执行结果会造成子控件需要清除并重新产生,就会再次设置它为false。再PreRender的时候,检测这个bool值,如果需要重新装载则调用CreateRow重新装载。你的程序不会导致你所说的问题。你说“时间长了”就会造成什么事件问题呢?你一点也没有说明白。
      

  3.   

    完整的逻辑可以这样写:private bool SubControlsCreated = false; private void Page_Load(object sender, System.EventArgs e)

      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方法。
      

  4.   

    无法搞清楚“时间长了触发事件的时候会有问题”到底是什么意思。只能猜测估计跟很多人说的“时间长了Session丢失了”是同一个意思。如果是这样,那么你应该表现在CreateRow方法内部创建控件的结果不一样(会话状态错误了,判断结果不一样了)。不知道你的问题表现跟Session、应用程序中静态变量之类的值有没有关系。
      

  5.   

    amandag(高歌) ( ) 信誉:100    Blog   加为好友  2007-4-23 23:20:42  得分: 0  
     
     
       
    时间长了触发事件的时候会有问题
    ================================一般是由于你所创建的控件的对象的引用已经出了生命周期(也就是说由于某个函数的结束,所以你的对象的引用就被销毁了,那些对象迟早会被回收)。建议你在类一级声明这个控件,但可以在方法中动态地创建它,这样就可以避免回收的问题了  
     楼上的这位说的是正解,再测试一下,如果没问题,结贴
      

  6.   

    saucer(思归) ,这位的方法是错误的
      

  7.   

    amandag(高歌) ( ) 的是正解,原因就是我声明控件的时候是局部声明,我换成全局变量就可以了,谢谢amandag(高歌) ( ) ,结贴给分