1

これは私を怒らせています....

フォームに複数のサブグリッドがあり、すべて同じエンティティで、異なるフィールドにフィルター処理されています。グリッドのリボンのボタンは、決定を下すために正確なグリッドの「インスタンス」を知る必要がある関数を呼び出します。これは、私が完全に迷っているところです。

リボンの定義では、呼び出された関数に CrmParameter SelectedControl を渡します。これはアクティブ グリッドであると想定されていますが、少なくともある意味ではそうです。

私が JavaScript コードでやりたいことは、その名前でグリッドの 1 つを取得し、それを関数に渡されたオブジェクトと比較することです。ただし、これは完全に異なるオブジェクトであり、それを使用してほとんど何もできません。 . その名前、ID、ラベルを取得することはできません。SDK のコントロール用にリストされているすべてのメソッドのうち、getVisible()、setVisible()、setFocus()、refresh() の 4 つだけが機能します。これらは、私がする必要があることにはあまり役に立ちません。

その後、同僚から Xrm.Page.ui.getCurrentControl() を試すように言われましたが、これはまったく同じ動作を示しますが、おかしなことに 2 つのオブジェクトは等しくありません。

.getControl() 経由で取得したコントロールの .control プロパティを使用する Google であいまいなものを見つけたので、.getCurrentControl() 経由で取得したものと比較したところ、一致しました。残念ながら、「現在のコントロール」はすべてのサブグリッドの .control プロパティと一致します。

何が何であるかを明確にするためのいくつかのコード:

function ribbonAction(param) // param is the SelectedControl parameter
{
    var current = Xrm.Page.ui.getCurrentControl();
    var grid1 = Xrm.Page.getControl("grid1");
    var grid2 = Xrm.Page.getControl("grid2");

    alert(param == current);            // false
    alert(param == grid1);              // false
    alert(param == grid1.control);      // false
    alert(current == grid1);            // false
    alert(current == grid1.control);    // true
    alert(current == grid2.control);    // true

    alert(current.getName());           // throws an error
    alert(param.getName());             // throws an error

    current.refresh();                  // refreshes the correct grid
    param.refresh();                    // refreshes the correct grid
}

コメントは、grid1 がアクティブなときにリボン ボタンをクリックすると何が起こるかを示しています。

そのような状況でアクティブなサブグリッド コントロールを実際に識別する方法についてのヒントをいただければ幸いです。

4

1 に答える 1

1

これも私を怒らせていました!これが私がそれをクラックした方法です:

サブ グリッドが存在するエンティティ フォームの JavaScript ライブラリでグローバル変数を指定します。

var SelectedSubGrid;

同じライブラリに、TagGrid という関数を次のように追加します....

function TagGrid(SubGridName)
{
            if(document.getElementById(SubGridName + "_d") != null)
            {
                        document.getElementById(SubGridName + "_d").onclick = function () { SelectedSubGrid = SubGridName };
            }
}

次に、GetCurrentGrid という 2 番目の関数を次のように追加します....

function GetCurrentGrid()
{
            // add code here to check current grid and execute differently as required...
            alert('Current Grid is ' + SelectedSubGrid);          
}

同じエンティティ タイプのサブグリッドごとに TagGrid 関数の呼び出しを含めます。以下の例では、カスタム エンティティ タイプ「Business Pitch Event」の 2 つのサブ グリッドがあり、1 つのグリッドは「DocumentationEvents」という名前で、もう 1 つのグリッドは「BusinessPitchEventEvents」です。

function OnLoad()
{
            TagGrid("DocumentationEvents");
            TagGrid("BusinessPitchEventEvents");
}

次に、サブ グリッド リボン ボタンで GetCurrentGrid 関数を呼び出します。

于 2012-08-21T08:32:53.600 に答える