艾伟:DynamicControl/DynamicField 例外的解决

简介:   在使用 DynamicField / DynamicControl 时,经常在PostBack时,会出现一个例外:  The DynamicControl/DynamicField needs to exist inside a data control that is bound to a data source that supports Dynamic Data.  中文为:  绑定到支持动态数据的数据源的数据控件内必须存在 DynamicControl/DynamicField    具体发生原因暂时不太清楚,估计是PostBack的事件流程和页面正常加载不一致。

  在使用 DynamicField / DynamicControl 时,经常在PostBack时,会出现一个例外:

  The DynamicControl/DynamicField needs to exist inside a data control that is bound to a data source that supports Dynamic Data.

  中文为:

  绑定到支持动态数据的数据源的数据控件内必须存在 DynamicControl/DynamicField

 

  具体发生原因暂时不太清楚,估计是PostBack的事件流程和页面正常加载不一致。当PostBack后,数据控件(如DetailsView, GridView, ListView 等)在状态加载时, 会把所有的 Fileds或Columns初始化一次,而这一次,由于数据源没有绑定,所以找不到相关的 MetaTable。在这种情况下,DynamicControl 和 DynamicField 都是丢出上述的例外。

  不过,从应用上来看,如果数据绑定做的合理的话(比如在InitComplete以前绑定),是不会出现这个问题的。但是一旦出了这个问题,解决起来就比较麻烦了,因为常常有些人习惯于在Load中绑定数据,要修改的话,常常会牵连一大堆的代码。希望对这个问题比较了解的朋友多多指教。

  目前我采用的方法,可以不改变原有的绑定流程,可以跟以前的Eval、Bind等一样使用,可以让大家试试。在使用中如有发现有Bug,请发邮件告诉我。因为我最近几个月都在应用 DynamicFieldTemplates 来开发应用程序,对这些问题比较关心。

  使用这种方法,可以让一些程序经验不足的人,也能避开这个错误。

  我分别从DynamicControl 和 DynamicField 继承了新的类 DdControl 和 DdField,然后在初始化时,判断是否存在MetaTable,如果不存在,则不再初始化。然后,程序中原本所有采用 DynamicControl/DynamicField的地方,都换成DdControl/DdField。

  DdControl/DdField的源码如下:

namespace  Common
{
    
public   class  DdField : DynamicField
    {
        
public   override   void  InitializeCell(System.Web.UI.WebControls.DataControlFie
ldCell cell, System.Web.UI.WebControls.DataControlCellType cellType, System.
Web.UI.WebControls.DataControlRowState rowState, 
int  rowIndex)
        {
            
//  HACK: Fix bug for: The DynamicControl/DynamicField needs to exist inside a data control that is bound to a data source
that supports Dynamic Data.

             if  ( base .Control.FindMetaTable()  ==   null )
                
return ;

            
base .InitializeCell(cell, cellType, rowState, rowIndex);
        }

    }
}

 

namespace  Common
{
    
public   class  DdControl : DynamicControl
    {
        
protected   override   void  OnInit(EventArgs e)
        {
            
//  HACK: Fix bug for: The DynamicControl/DynamicField needs to exist inside a data control that is bound to a data source
that supports Dynamic Data.

             if  ( this .FindMetaTable()  !=   null )
                
base .OnInit(e);
        }
    }
}

 

  使用时,只要在web.config中配置好前缀,就可以直接使用了。如:


< add  tagPrefix ="asp"  namespace ="Common"  assembly ="Common" />

 

< DetailsView >
  
< Fields >
    
< asp:DdField DataField = " Name "   />
   
  
Fields>
DetailsView>

 

目录
相关文章
C++命名空间揭秘:一招解决全局冲突,让你的代码模块化战斗值飙升!
【8月更文挑战第22天】在C++中,命名空间是解决命名冲突的关键机制,它帮助开发者组织代码并提升可维护性。本文通过一个图形库开发案例,展示了如何利用命名空间避免圆形和矩形类间的命名冲突。通过定义和实现这些类,并在主函数中使用命名空间创建对象及调用方法,我们不仅解决了冲突问题,还提高了代码的模块化程度和组织结构。这为实际项目开发提供了宝贵的参考经验。
102 2
|
9月前
|
Swift开发——属性检查器
Swift中的属性检查器(willSet, didSet)允许在设置存储属性值前后执行代码。在类`Circle`中,属性`radius`使用属性观察器:willSet在赋值前检查值,若值为负则打印警告;didSet在赋值后比较新旧值,根据变化输出相应信息。在实例`c`中,`radius`从-5变为0时,输出“Input value is negative.”和“The circle gets smaller.”;从0变为10时,输出“Input value is normal.”和“The circle gets larger.”。
241 4
Swift开发——属性检查器
技术心得记录:强命名的延迟与关联在.net程序集保护中的作用及其逆向方法
技术心得记录:强命名的延迟与关联在.net程序集保护中的作用及其逆向方法
揭秘C标识符的隐藏规则,不学会后悔的技巧!
揭秘C标识符的隐藏规则,不学会后悔的技巧!
53 0
|
10月前
|
【C++ 概念区分】C++ 中覆盖,重写,隐藏 三者的区别
【C++ 概念区分】C++ 中覆盖,重写,隐藏 三者的区别
265 0
【C++】万能引用、完美转发
【C++】万能引用、完美转发
65 0
JavaScirpt基础 之 严格模式的限制 十一
变量名不能使用 "arguments" 字符串
80 0
变量命名冲突的解决思路(spring框架中使用${}动态引入用户名,想连接数据,结果访问被拒绝)
变量命名冲突的解决思路(spring框架中使用${}动态引入用户名,想连接数据,结果访问被拒绝)
186 0
变量命名冲突的解决思路(spring框架中使用${}动态引入用户名,想连接数据,结果访问被拒绝)
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等