|
![]() |
#1 |
Участник
|
Пасиб за советы!
Тогда так: определю датасорсы, все...(это я уже сделал); список датасорсов(их имен) уже есть...осталось "выбрать" из них главного...думаю это не проблема... Выяснить где диспл. метод ,а где нет...вроде на этом форуме я где-то видел,..буду смотреть, разбираться... вопрос: как определить,...но на гриде есть столько то полей....и 2 из них диспленые... т.е как обратиться к контролу и спросить его... design("design").grid.stringedit ? ....как? |
|
![]() |
#2 |
Banned
|
Цитата:
http://www.axforum.info/forums/showthread.php?t=701 Последний раз редактировалось EVGL; 11.01.2007 в 18:17. |
|
![]() |
#3 |
Moderator
|
Некоторым боком сегодня был недалеко от этой темы и набросал небольшой пример. Немного помучался, куда помещать это сообщение - сюда или в свой "блог". Решил всё же сюда, так как здесь уже имеется интересное готовое обсуждение.
Простенький статический метод. Без больших претензий. Построчно выводит в буфер текстовые представления значений (valueStr) контролов грида (со строкой заголовков). Не умеет работать с выделенными строками, но учитывает сортировку, фильтрацию, перестановку и скрытие колонок пользователем. И нумерует строчки - о как! ![]() 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(); ; grid = _formRun.design().controlName(_gridName); // заголовки колонок (label) -> вывод в буфер lineToBuffer = strfmt('%1%2', 'Row', _separator); for (i=1; i<=grid.controlCount(); i++) { control = grid.controlNum(i); 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); 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; } X++: public int mouseDblClick(int _x, int _y, int _button, boolean _Ctrl, boolean _Shift) { int ret; ret = super(_x, _y, _button, _Ctrl, _Shift); KKu::gridToBuffer(element, 'Grid').toClipboard(); return ret; } После двойного щелчка и наблюдения за тем, как пробежит вниз бегунок вертикальной полосы прокрутки, можно перейти в Excel и выполнить вставку. Если у вас очень много основных средств, желательно сначала наложить фильтр, чтобы в рамках эксперимента разумно ограничить количество строк в буфере. |
|
![]() |
#4 |
Axapta Retail User
|
Цитата:
Сообщение от Gustav
![]() Простенький статический метод. Без больших претензий. Построчно выводит в буфер текстовые представления значений (valueStr) контролов грида (со строкой заголовков). Не умеет работать с выделенными строками, но учитывает сортировку, фильтрацию, перестановку и скрытие колонок пользователем. И нумерует строчки - о как!
![]() 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). |