CRM 2011:使用功能区JavaScript查找当前网格

时间:2012-03-09 14:58:27

标签: javascript dynamics-crm dynamics-crm-2011 ribbon subgrid

这个让我发疯了......

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

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

我想在我的JavaScript代码中做的是通过其名称获取我的网格之一,然后将其与传递给我的函数的对象进行比较 - 只是这是一个完全不同的对象,你可以在旁边做什么都没有。 你不能得到它的名字,ID,标签;在SDK中为控件列出的所有方法中,只有四个工作:getVisible(),setVisible(),setFocus()和refresh()。这些对我需要做的事情并不是很有用。

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

我通过Google发现了一些模糊的东西,它使用了通过.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处于活动状态时单击功能区按钮时会发生什么。

对于在这种情况下如何真正识别活动子网格控件的任何提示,我将非常感激。

1 个答案:

答案 0 :(得分: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函数!