CRM 2011:在ribbon JavaScript中查找当前网格



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

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

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

我想在我的JavaScript代码中做的是通过它的名称获取我的一个网格,然后将它与传递到我的函数中的对象进行比较——只是这是一个完全不同的对象,你几乎什么都做不了。你不能得到它的名字,身份证,标签什么的;在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处于活动状态时单击功能区按钮时会发生什么。

我将非常感谢任何关于如何在这种情况下真正识别主动子网格控制的提示。

这也让我抓狂!以下是我破解它的方法:

在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函数!

最新更新