网页中动态生成控件的有效控制方案初步(二)

有网友问及在ASP.NET中动态生成控件在回调时控件不复存在的问题(见帖子:☆★请教关于动态生成控件的问题!急等回复!!救命啊!!),针对这个问题,我提出的解决方案如下(由于工作原因,没有很好整理,改天稍有空闲再把这些内容整理一下形成一个完整解决方案的文档,相信这两个文档对大多数用户已经足够起到启发式的作用了*_*):

对于你的这个问题,我的解决方案是(没有办法实地测试,只能是根据你的描述和需求分析和拍脑袋解决了):

把你动态生成控件的代码写到一个过程中:

private void CreateDynamicControls()//具体需要传递什么的参数及返回什么样的值自己考虑了。
{
}


在这个过程中进行一个简单的处理:

1——
清除容器(父)控件中所有通过本方法动态生成的子控件
比如:PH1.Controls.Clear();

2——
生成需要的所有控件

3——
把这些控件通过Controls.Add添加到指定的容器(父)控件中(比如PH1.Controls.Add(ov))


这样你就模块化的实现了所需要控件的动态生成的过程,接下来就是你根据需要动态调用这个函数的问题了。


首先,这个方法应该在OnInit函数中调用,这样可以确保动态生成的控件在PostBack的时候仍然在页面中存在(系统还没有智能到这个地步,是不会自动生成的),否则,系统将在POSTBACK的时候不能获得动态生成的控件,导致数据丢失。

其次,在你的代码处理过程(事件处理过程)中,根据需要适当的调用这个函数,实现具体内容的动态修改。


这里要注意的几个问题:

1——
既然控件是动态生成的,那么第一次启动页面(IsPostBack为false时)页面中实际上是不存在动态生成的控件的,这个时候,要对在OnInit中对CreateDynamicControls的调用进行判断:

if(Request.Form["__VIEWSTATE"]!=null)
{
  //这里根据需要初始化并调用方法CreateDynamicControls
}

2——
在OnInit中调用函数CreateDynamicControls动态创建控件时,所创建的控件数量的控制以及其数据来源的问题。
这个问题的解决,可以采用ViewState来保存相关的数据信息:

假设,你动态生成控件时,是用户切换了分页、用户改变了搜索条件导致的,那么需要把当前的页码信息和搜索条件等信息保存到VIEWSTATE中,这样可以保证在OnInit中调用CreateDynamicControls函数时使用了相同的数据信息,从而保证PAGE在POSTBACK时动态生成控件的正确恢复。
在这个解决中,VIEWSTATE中的数据是晚于OnInit生成的,也就是说调用OnInit时,VIEWSTATE中还没有把数据有效的生成,因此保存到VIEWSTATE中是不可取的,这里可以采取迂回的解决方案:以前写ASP时的方法:

A——
定义一个HIDDEN类型的INPUT,设置RUNAT=SERVER,ID为HIDDENTEXT(假设这个ID)

B——
在事件PreRender中,实现上面数据信息(如页码、搜索条件等)进行处理后保存到HIDDEN域中:
HIDDENTEXT.Value=...

C——
在OnInit中:
if(Request.Form["__VIEWSTATE"]!=null)
{
  string strHiddenText=Request.Form[HIDDENTEXT.UniqueID];
  //这里分析strHiddenText,把相关信息回复到对应的变量中
  //这里根据需要初始化并调用方法CreateDynamicControls
}


在这个解决数据信息的方案中,存在一个问题,就是数据库的信息可能随时都在变,虽然有页码信息和搜索条件信息,但当PAGE POSTBACK的时候,按照这些条件获取的数据并不是原来的数据(因为数据在变呀!),怎么办?

解决:

a——
动态生成控件时用到的数据序列化后保存到上面的HIDDENTEXT中,在OnInit中在获取了HIDDENTEXT的数据后再进行反序列化获得数据。
这个方法有个麻烦:数据量大时,页面往返传输大量的数据浪费大量的带宽资源

b——
针对a中的解决方案带宽资源浪费大的问题,这里采取新的解决方案:使用CACHE来存取动态控件用到的数据
Cache["DynamicControlsDataSet"]=ds;//动态数据的数据集DataSet,具体自己确定
这样在OnInit中:
if(Request.Form["__VIEWSTATE"]!=null)
{
  DataSet ds=(DataSet)Cache["DynamicControlsDataSet"];
  //这里分析strHiddenText,把相关信息回复到对应的变量中
  //这里根据需要初始化并调用方法CreateDynamicControls
}
这里还存在的一个问题是:Cache是共享使用的,会导致数据的干扰!解决:使用GUID来处理:

::定义变量
private string m_strGuid;

::保存数据
在PreRender事件处理中:
if(m_strGuid==null)
{
  m_strGuid=System.Guid.NewGuid().ToString();
}
Cache[m_strGuid]=ds;
HIDDENTEXT.Value=m_strGuid;

在OnInit中:
if(Request.Form["__VIEWSTATE"]!=null)
{
  m_strGuid=Request.Form[HIDDENTEXT.UniqueID];
  DataSet ds=(DataSet)Cache[m_strGuid];
  //这里分析strHiddenText,把相关信息回复到对应的变量中
  //这里根据需要初始化并调用方法CreateDynamicControls
}

到这里,本问题的解决就大功告成了,下面就是你在具体应用中代码的实现问题了。

 

转载于:https://www.cnblogs.com/Daview/archive/2004/08/09/31360.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值