TeaDrivenDev
TeaDrivenDev

Reputation: 6629

CRM 2011: Find current grid in ribbon JavaScript

This one is driving me mad....

I have several subgrids in a form, all of the same entity and filtered to different fields. A button in the grid's ribbon calls a function that needs to know the exact grid "instance" to make a decision - and this is where I am completely lost.

In my ribbon definition, I pass the CrmParameter SelectedControl to the called function. This is supposed to be the active grid - and it apparently is, in a way at least.

What I would like to do in my JavaScript code is get one of my grids via its name and then compare it to the object that's passed into my function - only that this is some completely different object, and you can do next to nothing with it. You can't get its name, ID, label whatever; of all the methods listed for controls in the SDK, only four work: getVisible(), setVisible(), setFocus() and refresh(). These are not very useful for what I need to do.

A colleague then told me to try Xrm.Page.ui.getCurrentControl() - but that shows the exact same behavior, although funnily the two objects aren't even equal.

I found something vague through Google that used the .control property of a control retrieved via .getControl(), so I compared the one obtained via .getCurrentControl() to that - and they matched. Unfortunately, the "current control" matches the .control properties of all subgrids.

Some code to make it clearer what is what:

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
}

The comments tell what happens when the ribbon button is clicked while grid1 is active.

I would be very grateful for any hints on how to really identify the active subgrid control in that situation.

Upvotes: 1

Views: 2751

Answers (1)

NickD
NickD

Reputation: 11

This was driving me mad too! Here is how I cracked it:

Specify a global variable in a JavaScript library for the entity form in which your sub grids reside.

var SelectedSubGrid;

In the same library add a function called TagGrid as follows....

function TagGrid(SubGridName)
{
            if(document.getElementById(SubGridName + "_d") != null)
            {
                        document.getElementById(SubGridName + "_d").onclick = function () { SelectedSubGrid = SubGridName };
            }
}

Then add a second function called GetCurrentGrid as follows....

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

Include a call to the TagGrid function for each subgrid of the same entity type. In my example below I have two sub grids of custom entity type 'Business Pitch Event', one grid named 'DocumentationEvents' and the other 'BusinessPitchEventEvents'.

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

Then on your sub grid ribbon button, call the GetCurrentGrid function!

Upvotes: 1

Related Questions