2

できる限りご説明いたしますので、ご不明な点がございましたらお気軽にお問い合わせください。

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、内部コントロールreadyStatecomplete?

4

2 に答える 2

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");
}

コントロール( array の要素)であるためcontrols[i]、あなたのケースでは定義されていないため、例外が発生しています。icontrols

于 2013-03-17T14:39:26.977 に答える
0

CRM仲間に聞いてみました。彼は、問題は新しいリフレッシュメント エンジンに依存していると述べました。彼によると、それは一種のバグですが、実際にはそうではありません。私が正しければ、更新は新しい永久保存機能に対応するように再設計されています。

于 2013-03-20T20:53:59.037 に答える