asp.net中,维护动态加载控件的类实现 的想法

asp.net的程序设计中,个人认为,动态加载控件,维护其状态,是一件非常麻烦的事情,不仅需要在页面的特定处理阶段去创建这个控件,还需要在每次页面加载的时候,重新创建这个控件,并且指定其事件处理程序等等。这个维护工作量非常大,如果一个页面上有多个控件是动态创建的话。

同样的事情,在C/S结构的程序设计中,就变得非常简单,我们只需要一次创建,那么控件就永远会在那个地方,除非显示删除它。

为什么会这样,原因就在于c/sb/s的架构不同,c/s是一次创建界面,而b/s结构是多次创建。b/s结构基于非持续连接的网络,因此她需要维护每一次交互的状态,根据这些状态信息来创建界面。虽然在asp.net中,相当大一部分工作已经被隐藏起来,并且已经做的很好了,但是在动态控件这一块,我觉得仍然需要有改进的地方。

 

来看看传统上我们是怎样处理处理动态控件的

Private button_clicked(….)

{

       //…. Do something

       Button btn = new Button();

       PlaceHolder1.Controls.Add(btn);

       Btn.Click += ….;

       Btn.Text = “…”

 

       ViewStatue[“btnCreated”] = true;  //设置控件被创建标志

       // …

}

然后在页面的Page_Load事件中还要

Page_Load(…)

{

       If (ViewStatue[“btnCreated”] != null)

       {

              Button btn = new Button();

              // 重复button_clicked事件里的步骤

       }

}

 

可能仅仅一两个同类的控件还没什么,但是如果碰上需要动态创建很多不同种类控件,控件的地点又分布在页面的各个地方,那么这件事就会变得非常复杂和难以把握。初步

 

个人觉得,维护动态创建的控件的状态,完全可以由Page的基类来实现,由这个类完成对动态加载控件的监控,并在页面重新载入的适当时候,创建控件,并加入到合适的地方,使得开发人员感觉控件的创建是一次性的,不需要每次页面载入的时候都要重新创建。

 

这个基类实现的初步想法如下

 

Public class PersistanceDynamicControl : System.Web.UI.Page

{

       // 存放动态创建的控件信息列表,当然这里仅仅是演示,实际应用中应该会用到ViewState来保存这张列表

Object [] dynamicControlsList ;

 

       // 用来在页面上加入动态创建的控件

       // 此函数为实现的核心部分,它可以利用反射将建立的动态控件的状态信息读取(包括位置信息),并保存,以便在下一此页面建立的时候创建这些控件。

       Public AddControl(Control parentControl, Control dynamicControl)

 

       //该函数用来根据保存动态控件列表,创建控件,并将它们放入合适地点,该函数可以在OnInit函数中被调用

       Private CreateDynamicControls()

       Public override OnInit()

       {

              CreateDynamicControls();

       }

 

       //索引器,返回动态创建控件的引用

       Object DynamicControls[string ControlName]

}

 

 

 

然后,创建的页面只需要继承这个基类,用AddControl()函数来加入动态创建的控件,用 (ClassType)base.DynamicControls[“ClassName”]的方式得到动态创建的控件的引用。动态控件一旦加入到页面上,便一直可以访问,不管page post back多少次。这样,就和c/s结构有点类似了。

 

这只是自己的一个不成熟的想法,目前还没有实现,欢迎大家批评。

posted @ 2005-09-09 11:16  OOP  阅读(1648)  评论(2编辑  收藏  举报