首页 > 编程 > .NET > 正文

Asp.Net中页面运行时动态载入的UserControl内元素的事

2024-07-10 13:12:39
字体:
来源:转载
供稿:网友

在asp.net页面的开发过程中,我们肯定经常会用到自定义的usercontrol来复用部分页面元素,我们有两种使用usercontrol的方式

1、在设计时往页面里添加需要的usercontrol(最常用的就是从solutionexplorer拖ascx到设计页面)

此种情况下,如果将usercontrol放置在runat=server的html标签中,将可能导致usercontrol内的元素事件处理不能正确执行。
例如:我们有时用一个div作为边框包含了需要的usercontrol,而出于在运行时控制div的显示效果(比如运行时隐藏/显示这个div)的目的,可能将该div设为runat=server,此时,往往包含于div的usercontrol内的元素事件触发可能被忽略,usercontrol内的事件处理函数往往是不能正常运行的。

2、在运行时使用loadcontrol函数动态载入usercontrol,再add到指定的位置

在动态载入的情况下,除了以上的问题同样存在之外,还会带来相应的初始化时的问题,这时,为了保证你的usercontrol以你希望的语义正常运行,必须注意两点:

1)如果在loadcontrol该usercontrol的同时需要调用usercontrol的某个初始化函数的话,该初始化函数的调用必须在将该ctladd到指定的页面某元素的controls中之后进行,即必须按如下顺序:
...
myctl ctl = (myctl)loadcontrol("path");
this.somectl.controls.add(ctl);
ctl.initmethod();//本语句必须在上一条之后,否则ctl中的事件导致postback后,需要保持的textbox、listbox等的数据将丢失,导致各种错误

2)如果在loadcontrol该usercontrol的同时需要调用usercontrol的某个初始化函数的话,该函数体内要注意对不需每次执行的代码放入if (!ispostback){}语句块中,否则会导致每次提交时被重复运行,这和page_load中的处理方法其实是一样的,但往往容易被忽略。


对于动态载入的usercontrol还要保证每次postback时都重新load所有的usercontrol(但postback时可以不初始化usercontrol内的元素的初始值),否则事件处理函数会找不到对应的触发源,保存于viewstate的数据也将因找不到对应元素而保持不了。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表