2013-03-17 77 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伙伴。他说这个问题取决于新的引擎。据他说,这是一个错误,但不是真的。如果我说得对,刷新已重新设计,以适应新的永久保存功能。