Кастомизация
12
Дек
3

Приемы работы с вложенными Представлениями

Получение строк списка

Получение одного столбца (fullname) всех строк вложенного Представления (accountContactsGrid):

var gridControl = document.getElementById('accountContactsGrid').control;
var ids = gridControl.get_allRecordIds();
for (i = 0; i < ids.length; i++) {
    var cellValue = gridControl.getCellValue('fullname', ids[i]);
    alert(cellValue);
}


Выше показанный пример прекрасно работает когда код выполняется на уже загруженной форме или при onSave’е. Но непосредственно при загрузке формы Вы можете столкнутся с ошибками, поскольку вложенные Представления загружаются асинхронно и на момент выполнения кода строк еще может не быть (как и самого вложенного Представления).
Чтобы исправить это, Вам необходимо периодически проверять на onLoad’е загрузилось ли вложенное Представление с помощью setTimeout:

function subGridOnload() {
    var grid = document.getElementById('accountContactsGrid');
    if (grid.readyState != "complete") {
        setTimeout(subGridOnload, 1000); // Ждем секунду и повторно вызываем текущую функцию
        return;
    }

    // Код 
}

Еще один пример… на этот раз получаем все столбцы всех строк:

var gridControl = document.getElementById('accountContactsGrid').control;
for (var intRowNumber = 0; intRowNumber < gridControl.getRecordsFromInnerGrid().length; intRowNumber++)
    for (var intCellNumber = 0; intCellNumber < gridControl.getRecordsFromInnerGrid()[intRowNumber][3].cells.length; intCellNumber++)
        alert(gridControl.getRecordsFromInnerGrid()[intRowNumber][3].cells[intCellNumber].outerText);


Возвращение только GUID’ов выделенных строк:

var grid = document.getElementById("yourSubGridName").control;
var ids = gridControl.get_selectedIds();

Получение выделенных строк списка

function ReadingGridControl() {
    var gridControl = document.getElementById('accountContactsGrid').control;
    for (var intRowNumber = 0; intRowNumber < gridControl.getRecordsFromInnerGrid().length; intRowNumber++)
        for (var intSelectedRows = 0; intSelectedRows < gridControl.get_selectedIds().length; intSelectedRows++)
            if (gridControl.get_selectedIds()[intSelectedRows] == gridControl.getRecordsFromInnerGrid()[intRowNumber][0]) {
                for (var intCellNumber = 0; intCellNumber < gridControl.getRecordsFromInnerGrid()[intRowNumber][3].cells.length; intCellNumber++)
                    alert(gridControl.getRecordsFromInnerGrid()[intRowNumber][3].cells[intCellNumber].outerText);
            }
}

Подключение к событию обновления

Нижеследующий код позволяет повесить выполнение какой-либо функции на событие обновления вложенного Представления:

var grid = document.getElementById('accountContactsGrid');
grid.attachEvent("onrefresh", function () { alert("ау"); });

Тот же код для онлоада (где нужно подождать окончания загрузки):

function SubGridRefresh() {
    var grid = document.getElementById("accountContactsGrid");
    if (grid) {
        grid.attachEvent("onrefresh", function () { alert("ау"); });
    } else {
        setTimeout(SubGridRefresh, 1000);
    }
}

Принудительное обновление вложенного Представления

var grid = document.getElementById("accountContactsGrid"); // ID вложенного Представления
grid.control.refresh(); // обновляем...

Фильтрация записей во вложенном Представлении

Осуществялется путем подмены Fetch XML текущего Представления и принудительного обновления вложенного Представления:

var Grid = document.getElementById("accountContactsGrid"); // ID вложенного Представления

// Создаем новый Fetch XML
var fetchXml = '<fetch version="1.0" output-format="xml-platform" mapping="logical" distinct="false">' +
    '<entity name="contact">' +
        '<attribute name="fullname" />' +
        '<attribute name="parentcustomerid" />' +
        '<attribute name="telephone1" />' +
        '<attribute name="emailaddress1" />' +
        '<attribute name="contactid" />' +
        '<order attribute="fullname" descending="false" />' +
        '<filter type="and">' +
            '<condition attribute="statecode" operator="eq" value="0" />' +
        '</filter>' +
    '</entity>' +
'</fetch>';

Grid.control.setParameter("fetchXml", fetchXml); // Задаем для вложенного Представления новый Fetch Xml
Grid.control.refresh(); // Обновляем вложенное Представдение

Как сделать чтобы работало на онлоаде смотрите выше…

Комментарии (3)
  • Dmitry 12.12.2011

    привет!
    а не знаешь почему с глобальным гридом не поучается так работать?
    грид тот же, все методы есть но они не работают (

    я про вот этот var grid = document.getElementById(‘contentIFrame’).contentDocument.getElementById(‘crmGrid_visualizationCompositeControl’).control

  • slivka_83 12.12.2011

    Привет.
    Наверное потому что скрипт и грид находятся в разных фреймах.

  • OldCat 12.12.2011

    Подключение к событию обновления
    В связи с RU12(13) так больше не работает. Рабочая версия есть в статье http://mahenderpal.wordpress.com/2013/02/26/onrefresh-not-working-anymore-after-upgrading-to-polaris/

*

code