经常见到有人说在中不要使用动态控件我想主要的原因在于使用动态控件会带来一些问题在做项目的过程中我将由动态加载控件引发的总是作了一个小小的总结
在使用LoadControl加载控件后用户控件中的某些控件不再响应事件
这个问题主要是由于将控件加载放在if (!PageIsPostBack)之内引起的放在外面即可在思归的blog上对此问题进行了详细的说明
用户控件中某些控件的响应出现问题如某个按钮第一次选择时不触发CLICK事件第二次可以了
这是由于没有给控件设置ID引起的控件ID的作用在下面详细讲述 如
Control userControl=(Control)PageLoadControl(Testascx);
userControlID=Test;
AddControl(userControl);
如果用户控件中包括DataGrid控件那么加载控件后可能出现不响应DataGrid事件的问题
这好像是一个bug必须要将加载的控件进行强制转换如
Test userControl=(Test)PageLoadControl(Testascx);
注意上面使用的是Test类型而不是Control!
我在以前的Blog中曾提到过这个问题这种方式将使系统的扩展性降低 我有一个解决方案可以和大家讨论(运用策略模式)
public class BaseControl : SystemWebUIUserControl
{
public virtual BaseControl ProcessThisControl();
}
所有的用户控件从BaseControl 继承如果有Datagrid控件由overide ProcessThisControl方法 如
return this as Test;
按如下方式加载控件
BaseControl userControl=(BaseControl )PageLoadControl(Testascx);
userControlProcessThisControl();
在用户控件中如何使用JavaScript
大家都知道使用客户端的脚本将大大提高页面的响应速度同时可以避免频繁地刷新页面所以使用javascript来实现页面中部分控制是一个比较好的方式但是在用户控件中如果访问某一个子控件呢?
使用方式如下 documentall<%= TestControlClientID%>disabled=true; //将TestControl设置为不可用
如果在C#脚本中应该这样写PageRegisterStartupScript(OnInitControl<SCRIPT LANGUAGE=JavaScript>documentallTest_TestControldisabled=true;</SCRIPT>); //Test为用户控件TestControl为用户控件中的子控件
现在说一下控件ID在访问aspx文件时IIS会将aspx的脚本进行编译编译的时候将用户控件中的内容写在同一个页面中为了防止页面中的控件与用户控件中的控件名称相同在编译的时候对用户控件中的控件名称修改为 用户控件名子控件 控件ID则修改为 用户控件ID_子控件ID 在动态加载控件时如果不对控件的ID进行赋值则控件ID为上一次加载的控件ID因此在加载用户控件后应该立即对其设置ID