Цитата:
Сообщение от
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;
}