覆盖CRM网格中双击事件调用的标准方法。

时间:2012-02-17 15:01:43

标签: javascript events grid dynamics-crm dynamics-crm-2011

CRM 2011中的以下情况:我的目标是在一个网格中显示多个实体。因此,我们创建了一个包装实体,它链接到真实实体(包装器实体到实体A,B,C)。当创建A,B或C中的项时,插件也会创建包装器实体项。 像这样我可以有一个网格,“混合”所有实体,而实际上只显示包装器实体的项目。

但是,当然,如果我双击或右键单击 - >在这个网格中打开,我不想打开包装器实体项,我直接想打开例如实体A项目。功能区按钮顺便说一句没问题。

到目前为止我遵循了两条路线:

a)链接替换:在加载网格后,我浏览了DOM,并将oid,otype和otypename替换为(真实)目标项(实体A,B或C)的值。这个想法有两个缺点:首先是何时执行替换例程(仅在加载时不够,因为以后可以对页面进行排序,过滤或翻页)。第二个和男人的问题是功能区按钮。我想删除包装器实体项而不是它后面的发票。当我替换所有这些ID时,事情变得混乱。我必须用自定义按钮替换所有按钮。

b)方法/事件替换:只需替换调用项目详细信息窗口的事件即可。不幸的是我还没弄清楚CRM中如何实现这些事件,我希望能够取消事件并将其替换为我的事件,但这似乎是一个隐藏的秘密。 CRMWeb_static_grid \ AppGrid_DefaultData.htc有dblclick事件,但我不明白这是否是我正在寻找的以及如何取消附加。

有没有人试图在crm网格中替换事件处理程序或者知道它如何工作?

希望我的意思清楚......

非常感谢您的任何想法。

2 个答案:

答案 0 :(得分:1)

界面中的事件处理方式与IE处理所有事件的方式相同(仅举一个例子,请参阅SO问题Should i assign JavaScript events directly just to unify code?。)

覆盖默认双击操作的功能可能如下所示:

function Load() {
    var grid = document.getElementById("myGridName");
    grid.ondblclick = DoubleClickAction;
}

function DoubleClickAction() {
    var id, url;
    //get the id of the entity in the row you double clicked
    id = GetId();

    //generate the entity form url
    url = GetUrl();

    //open the record window
    OpenRecordWindow(url);
}

function OpenRecordWindow(url) {
    var url;

    if (Xrm.Page.context.isOutlookClient()) {
        openStdWin(url, "Your Title", "width=1024,height=768,status=1");
    }
    else {
        window.open(url);
    }

}

编辑:根据您的评论,您将在此处进行一些非常认真的DOM定制。每当网格刷新时,您必须为网格中的每一行更改dblclick事件,因为右键单击事件基于行的dblclick事件。因此,您必须找到网格并将refresh事件附加到网格,该事件会将dblclick事件附加到任何找到的行。

要获取网格的ID以及任何行的潜在ID,您可以使用IE的F12开发人员工具浏览/搜索HTML。

答案 1 :(得分:0)

您可以通过加入A到B和A到C来显示这些数据吗?这三个实体如何相关? A到B和A到C? A到B到C?

我问,因为您应该能够使用Views提供的标准连接功能来实现您的目标,并完全避免这种覆盖业务。如果你必须为这个视图设置实体之间的某些关系,那么可能更喜欢包装器实体。

(我更愿意将其添加为评论......我不认为我有足够的声誉)