Показать сообщение отдельно
Старый 08.09.2009, 16:18   #18  
wolfstein is offline
wolfstein
Axapta Retail User
Axapta Retail User
 
51 / 91 (4) ++++
Регистрация: 05.07.2006
Цитата:
Сообщение от Gustav Посмотреть сообщение
Простенький статический метод. Без больших претензий. Построчно выводит в буфер текстовые представления значений (valueStr) контролов грида (со строкой заголовков). Не умеет работать с выделенными строками, но учитывает сортировку, фильтрацию, перестановку и скрытие колонок пользователем. И нумерует строчки - о как! Может быть помещен, например, в Global или аналогичный класс - набор утилит (у меня такой класс называется KKu - я предпочитаю не портить фирменный Global ).
Если не возражаете доработал немного метод, т.к. он не учитывает контролы, которые "под" FormGroupControl в гриде:

X++:
static TextBuffer gridToBuffer( FormRun _formRun,
                                str     _gridName,
                                str     _separator = '\t')
{
    FormGridControl grid;
    FormControl     control;
    FormDataSource  formDataSource;
    Common          common;

    int             i;
    int             row;
    str             lineToBuffer;
    TextBuffer      textBuffer = new TextBuffer();

    //+ для работы с FormGroupControl в гриде
    FormGroupControl    groupCtrl;
    FormControl         controlGrp;
    int             j;
    //- для работы с FormGroupControl в гриде
    ;

    grid = _formRun.design().controlName(_gridName);

    // заголовки колонок (label) -> вывод в буфер
    lineToBuffer = strfmt('%1%2', 'Row', _separator);
    for (i=1; i<=grid.controlCount(); i++)
    {
        control = grid.controlNum(i);
        //+ для работы с FormGroupControl в гриде
        if(classIdGet(control) == classnum(FormGroupControl))
        {
            groupCtrl = control;
            if(groupCtrl.isVisible())
            {
                for(j=1; j<=groupCtrl.controlCount(); j++)
                {
                    controlGrp = groupCtrl.controlNum(j);
                    if (controlGrp.isDisplayed())
                    {
                        lineToBuffer += strFmt('%1%2', controlGrp.labelText(), _separator);
                    }
                }
            }
        }
        else
        //- для работы с FormGroupControl в гриде
            if (control.isDisplayed())
            {
                lineToBuffer += strFmt('%1%2', control.labelText(), _separator);
            }
    }
    lineToBuffer = subStr( lineToBuffer, 1, strLen(lineToBuffer)-strLen(_separator) );
    textBuffer.appendText( lineToBuffer + '\n' );

    // ищем датасорс грида
    for (i=1; i<=_formRun.dataSourceCount(); i++)
    {
        if (_formRun.dataSource(i).id() == grid.dataSource())
        {
            formDataSource = _formRun.dataSource(i);
            break;
        }
    }

    // неявный цикл по строкам грида (явный - по датасорсу)
    row = 0;
    for ( common = formDataSource.getFirst() ? formDataSource.getFirst() : formDataSource.cursor();
          common ;
          common = formDataSource.getNext() )
    {
        row++;

        if (row==1)
        {
            formDataSource.first();
        }
        else
        {
            formDataSource.next();
        }

        // очередная строка -> вывод в буфер
        lineToBuffer = strFmt('%1%2', row, _separator);
        for (i=1; i<=grid.controlCount(); i++)
        {
            control = grid.controlNum(i);
            //+ для работы с FormGroupControl в гриде
            if(classIdGet(control) == classnum(FormGroupControl))
            {
                groupCtrl = control;
                if(groupCtrl.isVisible())
                {
                    for(j=1; j<=groupCtrl.controlCount(); j++)
                    {
                        controlGrp = groupCtrl.controlNum(j);
                        if (controlGrp.isDisplayed())
                        {
                            lineToBuffer += strFmt('%1%2',
                                strReplace(strReplace( controlGrp.valueStr(), '\n',' '), '\r',' '), _separator);
                        }
                    }
                }
            }
            else
            //- для работы с FormGroupControl в гриде
                if (control.isDisplayed())
                {
                    lineToBuffer += strFmt('%1%2',
                        strReplace(strReplace( control.valueStr(), '\n',' '), '\r',' '), _separator);
                }
        }
        lineToBuffer = subStr( lineToBuffer, 1, strLen(lineToBuffer)-strLen(_separator) );
        textBuffer.appendText( lineToBuffer + '\n' );
    }

    return textBuffer;
}
За это сообщение автора поблагодарили: Gustav (7).