这个让我发疯了......
我在表单中有几个子网格,所有相同的实体并过滤到不同的字段。网格功能区中的一个按钮调用一个功能,需要知道确切的网格“实例”来做出决定 - 这就是我完全迷失的地方。
在我的功能区定义中,我将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处于活动状态时单击功能区按钮时会发生什么。
对于在这种情况下如何真正识别活动子网格控件的任何提示,我将非常感激。
答案 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函数!