2012-03-09 1 views
1

Это один сводит меня с умом ....CRM 2011: Найти текущую сетку в ленте JavaScript

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

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

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

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

Я нашел что-то неопределенное в Google, которое использовало свойство .control элемента управления, полученного через .getControl(), поэтому я сравнил тот, который получен с помощью .getCurrentControl(), с этим - и они совпали. К сожалению, «текущий контроль» соответствует свойствам управления. все субгриды.

Некоторый код, чтобы сделать его более ясным, что это то, что:

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 
} 

Комментарии сказать, что происходит, когда кнопка ленты нажата в то время как СЕТКА1 активен.

Я был бы очень признателен за любые подсказки о том, как реально идентифицировать активный элемент управления подсетей в этой ситуации.

+0

Это нормально, что вы установили grid2 с помощью элемента управления «grid1»? Это объясняет, что оно также возвращает true для 6-го выражения. –

+0

Нет, это только что произошло от копирования этой строки; это всего лишь примерный код для подведения итогов всех моих наблюдений, у моих реальных элементов управления есть разные имена, которые не так легко перепутаны.Спасибо, что указали на эту опечатку. – TeaDrivenDev

ответ

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!