2013-03-17 29 views
2

我將盡我所能解釋這一點,請隨時根據需要要求澄清。SDK GridRefresh調用拋出異常

使用IE10,CRM Online和RU12。

我正在玩與子網格,並讓他們刷新。請看下面的代碼,我從MSDN缺口批發(和包裝在一個try/catch塊)

function start() { 
    try { 
     var controls = Xrm.Page.ui.controls.get(isSubGrid); 

     if (controls.length > 0) { 

      var subGridNames = ""; 
      for (var i in controls) { 
       controls[i].refresh(); 
       subGridNames += (" - " + controls[i].getName() + "\n"); 
      } 
      alert("The following subgrids were refreshed: \n" + subGridNames); 
     } 
     else { 
      alert("There are no subgrid controls on the current form."); 
     } 
    } 
    catch (ex) { 
     alert(ex); 
    } 
} 

function isSubGrid (control) 
{ 
    return control.getControlType() == "subgrid"; 
} 

什麼特別的存在 - 獲取subgrid類型的所有控件(這將返回10種元素如預期)和請致電refresh()

但是,這在第一次致電refresh()時始終失敗。

異常的詳細信息是相當簡單的

TypeError: Unable to get property 'Refresh' of undefined or null reference 

這表明在這裏

for (var i in controls) { 
    controls[i].refresh();//error thrown here - suggests controls[i] is null 
    subGridNames += (" - " + controls[i].getName() + "\n"); 
} 

這點在循環中調用時control[i]爲null但是我可以看到它是不是null (並按預期方法有refresh)。

enter image description here

我可以使它工作使用setInterval

function waitAndThenRefresh(gridname) { 
    var grid = Xrm.Page.ui.controls.get(gridname); 
    var intervalId = setInterval(function() { 
     if (grid === null || grid._control === null || grid._control._element === null) { 
      return; 
     } 
     if (grid._control._element.readyState === 'complete') { 
      window.clearInterval(intervalId); 
      if (grid != null) { 
       grid.refresh(); 
      } 
     } 
    }, 1000); 
} 

但是,這是非常可怕的,更何況不與SDK調用不能按預期工作解釋。

所以我想問題是:有其他人看過這個問題嗎?或者你可以在另一個實例上覆制它嗎?我錯過了什麼嗎? SDK中沒有任何內容表明您需要推遲調用refresh,直到內部控件的readyStatecomplete

回答

1

您正在使用的代碼塊,

for (var i in controls) { 
    controls[i].refresh(); 
    subGridNames += (" - " + controls[i].getName() + "\n"); 
} 

應替換爲以下幾點:

for (var i in controls) { 
    i.refresh(); 
    subGridNames += (" - " + i.getName() + "\n"); 
} 

或:

for (var i = 0; i < controls.length; i++) { 
    controls[i].refresh(); 
    subGridNames += (" - " + controls[i].getName() + "\n"); 
} 

你所得到的異常,因爲controls[i]是未定義在你的情況下,i是控件(數組012的元素)。

+0

道歉延遲響應。雖然我完全可以看到你在說什麼,但它會產生同樣的錯誤。很奇怪。 – glosrob 2013-03-19 00:47:46

0

我問了我的一個CRM夥伴。他說這個問題取決於新的引擎。據他說,這是一個錯誤,但不是真的。如果我說得對,刷新已重新設計,以適應新的永久保存功能。