有网友问及在ASP.NET中动态生成控件在回调时控件不复存在的问题(见帖子:☆★请教关于动态生成控件的问题!急等回复!!救命啊!!),这也是我在工作中遇到的问题,解决方案如下(以下内容直接复制自QQ聊天):
呵呵 就是上那个20分的问题 哈哈
笨笨蜗牛 17:37:18
哦。
笨笨蜗牛 17:37:33
你的ASP。NET开发基础如何?
我试验了很多办法了 都不成
控件一加载 以前给他的所有数据都没了
我甚至用 先生成
然后FINDCONTROL去找那个控件 然后运行它的一个函数来给它传数据 都不成
我以前学WIN32的
ASP.NET刚一个月
语言本身我觉得还可以 但是要说ASP就不是很好了
有个朋友说
感觉在把控件先ADD到页面上,在用一个DELEGATE可以搞定
我不太明白 什么意思 ?
笨笨蜗牛 17:40:05
我先给你讲一个我工作中遇到的问题。
笨笨蜗牛 17:40:49
我的页面中要用到多个USERCONTROL,不同的USERCONTROL根据用户的操作不同而显示状态不同,同一个时间只有一个USERCONTROL显示。
…… 我妈快回来了 我要去做饭~~~~~
真不好意思 啊
你晚上在吗?
或者您把讲解给我留言也可以啊
笨笨蜗牛 17:41:38
说白了,就是一个用户注册的页面,把不同的页面写成不同的USERCONTROL添加到页面中。
笨笨蜗牛 17:41:47
我就这样给你发吧。
哦 这我知道
笨笨蜗牛 17:41:58
等你看完后再问。
好吧 你发吧 详细点啊
呵呵 我先做饭去
笨笨蜗牛 17:43:24
通常的做法是把这些USERCONTROL一次添加进去,然后根据步骤的不同设置不同的USERCONTROL来显示。但我感觉这样的处理很浪费资源,而且没有什么技巧。于是,我采用动态添加USERCONTROL的方式来加载控件(LOADCONTROL)。
笨笨蜗牛 17:44:48
一步一步的走下去都很成功,但当我要获取USERCONTROL的数据时出问题了,因为不同的地方使用不同的USERCONTROL的,很难处理。后来我分析了.NET的运行机制,找到了解决办法。
笨笨蜗牛 17:47:17
问题的解决:
在页面中添加一个Hidden域,id为hiddenText
在页面中定义一个UserControl类型的变量userControl(用于放置加栽的USERCONTROL)
在页面中定义一个int类型的iCurStep(记录当前步骤)
在页面中定义了一个函数AddMainControl,这个函数根据iCurStep的不同来加栽不同的UserControl。
笨笨蜗牛 17:50:29
打开OnInit函数,在最前面:
try
{
iCurStep=Convert.ToInt32(Request.Form[hiddenText.UniqueID]);
}
catch
{
iCurStep=0;//默认为0,第一步
}
然后调用了AddMainControl来加载USERCONTROL控件
这样,就可以保证当页面POST的时候上次输出的USERCONTROL继续存在了。
笨笨蜗牛 17:52:06
在页面中有上一步和下一步按钮,对应的CLICK/COMMAND事件代码为:
iCurStep++
或
iCurStep--
然后调用AddMainControl。
这样保证了新步骤的USERCONTROL的加载。
笨笨蜗牛 17:55:23
在页面中增加PreRender事件的处理函数,在代码中:
hiddenText.value=iCurStep.ToString();
这样就把当前的步骤序号保存到了页面的视图数据中(这里不能使用VIEWSTATE来保存,因为OnInit之前,VIEWSTATE还没有加载数据。)
有了以上的步骤,我就成功的实现了动态加载USERCONTROL。
补充一点:上面的HIDDEN域是RUNAT=SERVER的。