1

这个快把我逼疯了......

我在一个表单中有几个子网格,所有相同的实体并过滤到不同的字段。网格功能区中的一个按钮调用一个函数,该函数需要知道确切的网格“实例”才能做出决定——这就是我完全迷失的地方。

在我的功能区定义中,我将 CrmParameter SelectedControl 传递给被调用的函数。这应该是活动网格 - 至少在某种程度上它显然是。

我想在我的 JavaScript 代码中做的是通过它的名称获取我的一个网格,然后将它与传递给我的函数的对象进行比较——只是这是一个完全不同的对象,你几乎可以用它做任何事情. 你不能得到它的名字、ID、标签等等;在 SDK 中为控件列出的所有方法中,只有四种有效:getVisible()、setVisible()、setFocus() 和 refresh()。这些对于我需要做的事情不是很有用。

然后一位同事告诉我尝试 Xrm.Page.ui.getCurrentControl() - 但这显示了完全相同的行为,尽管有趣的是这两个对象甚至不相等。

我通过谷歌发现了一些模糊的东西,它使用了通过 .getControl() 检索的控件的 .control 属性,所以我将通过 .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 的函数,如下所示....

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

包括对同一实体类型的每个子网格的 TagGrid 函数的调用。在下面的示例中,我有两个自定义实体类型“Business Pitch Event”的子网格,一个网格名为“DocumentationEvents”,另一个网格名为“BusinessPitchEventEvents”。

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

然后在您的子网格功能区按钮上,调用 GetCurrentGrid 函数!

于 2012-08-21T08:32:53.600 回答