CRM 2011: найти текущую сетку в ленте JavaScript - PullRequest
1 голос
/ 09 марта 2012

Этот сводит меня с ума ....

У меня есть несколько подсеток в форме, все одного и того же объекта и отфильтрованы по разным полям.Кнопка на ленте сетки вызывает функцию, которая должна знать точный «экземпляр» сетки, чтобы принять решение - и именно здесь я полностью теряюсь.

В своем определении ленты я передаю CrmParameter SelectedControlвызываемая функция.Предполагается, что это активная сетка - и это, по крайней мере, в некотором смысле.

Что я хотел бы сделать в своем коде JavaScript, так это получить одну из моих сеток через ее имя и затем сравнить ее собъект, который передается в мою функцию - только то, что это какой-то совершенно другой объект, и вы ничего не можете с ним поделать.Вы не можете получить его имя, удостоверение личности, ярлык, что угодно;из всех методов, перечисленных для элементов управления в SDK, работают только четыре: getVisible (), setVisible (), setFocus () и refresh ().Они не очень полезны для того, что мне нужно сделать.

Затем мой коллега сказал мне попробовать Xrm.Page.ui.getCurrentControl () - но это показывает точно такое же поведение, хотя, как ни странно, два объекта не 't даже равно.

Я обнаружил что-то неопределенное в Google, в котором использовалось свойство .control элемента управления, полученного с помощью .getControl (), поэтому я сравнил тот, полученный с помощью .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 Ответ

1 голос
/ 21 августа 2012

Это тоже сводило меня с ума!Вот как я ее взломал:

Укажите глобальную переменную в библиотеке 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 для каждой подсетки того жетип объекта.В моем примере ниже у меня есть две подсетки пользовательского типа сущности «Событие бизнес-тона», одна сетка с именем «DocumentationEvents», а другая «BusinessPitchEventEvents».

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

Затем на кнопке ленты подсетки вызовитефункция GetCurrentGrid!

...