熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

DynamicControl/DynamicField 例外的解決

2013-11-13 10:21:30  來源: .NET編程 

  在使用 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中綁定數據要修改的話常常會牽連一大堆的代碼希望對這個問題比較了解的朋友多多指教
 

  目前我采用的方法可以不改變原有的綁定流程可以跟以前的EvalBind等一樣使用可以讓大家試試在使用中如有發現有Bug請發郵件告訴我因為我最近幾個月都在應用 DynamicFieldTemplates 來開發應用程序對這些問題比較關心

  使用這種方法可以讓一些程序經驗不足的人也能避開這個錯誤
 

  我分別從DynamicControl 和 DynamicField 繼承了新的類 DdControl 和 DdField然後在初始化時判斷是否存在MetaTable如果不存在則不再初始化然後程序中原本所有采用 DynamicControl/DynamicField的地方都換成DdControl/DdField

  DdControl/DdField的源碼如下
 

  namespace Common
{
    public class DdField : DynamicField
    {
        public override void InitializeCell(SystemWebUIWebControlsDataControlFieldCell cell SystemWebUIWebControlsDataControlCellType cellType SystemWebUIWebControlsDataControlRowState 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 (baseControlFindMetaTable() == null)
                return;

  baseInitializeCell(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 (thisFindMetaTable() != null)
                baseOnInit(e);
        }
    }
}
 
  使用時只要在nfig中配置好前綴

  就可以直接使用了

  <! 假設上述的程序生成 Commondll >
<add tagPrefix=asp namespace=Common assembly=Common/>

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


From:http://tw.wingwit.com/Article/program/net/201311/13365.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.