できる限りご説明いたしますので、ご不明な点がございましたらお気軽にお問い合わせください。
RU12 で IE10、CRM Online を使用しています。
私はサブグリッドで遊んでいて、それらをリフレッシュしています。次のスクリプトを考えてみましょう。これは、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
control[i]
これは、ここでこの時点でループで呼び出されたときに nullであることを示唆しています
for (var i in controls) {
controls[i].refresh();//error thrown here - suggests controls[i] is null
subGridNames += (" - " + controls[i].getName() + "\n");
}
ただし、null ではないことがわかります (そして、refresh
期待どおりのメソッドがあります)。
を使用して動作させることができます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
、内部コントロールreadyState
がcomplete
?