28.06.2013, 14:30 | #1 |
Участник
|
Отчет с динамич высотой контролов
Может, кому сэкономит время, тк я немного "поразвлекалась" , пока нашла решение.
Задача: Есть отчет, в котором один из контролов имеет дин высоту. Отчет-сетка т.е выглядит как таблица с разными по высоте строками , высота строки определяется высотой контрола с дин высотой. Графика для отрисовки таблицы создается с помощью Box+ vertical Lines Проблема: Для того, чтобы высота строк менялась динамически, и соответствеенно изменялась высота Box, и растягивались линии, логично выставить Height=ColumnHeight у контролов. Все работает, но я так и не поняла , что определяет ColumnHeight, в результате высота строк, что бы я ни делала - выше высоты контролов с тексом приблизительно на 1.5 символа (см описание проблемы тут) . Пользователи не оч рады, тк им не понятно, почему строки в 2 раза выше, чем должны были бы по логике вещей быть("можно было бы в 2 раза больше данных на листе уместить!") Решение: (основано на замечательном предложении Dronas) 1) Ставим DynHeight на контроле, кот изменяет высоту 2) Всем shapes устанавливаем ColumnHeight 3) На секции указываем высоту 0mm 4) в executeSection пишем: MySection.height100mm(MyDynHeightControl.heightOfWordWrappedString100mm(StringValue_In_MyDynHeightControl) + 200); PS: тут я накинула к высоте 200, чтобы текст не был оч близко к границе секции. 5) У всех остальных контролов ставим Height = Auto ( + можно TopMargin = 1mm, BottomMargin=1mm,чтобы контролы не были впритык к границе секции) Итого у нас в руках замечательный инструмент: используем достоинства ColumnHeight - все контролы замечательно растягиваются и создают нужную сетку, и нивелируем недостаток - высоту секции мы контролируем сами. Ax2009 RU2 Последний раз редактировалось IKA; 28.06.2013 в 14:35. |
|
|
За это сообщение автора поблагодарили: gl00mie (3). |
28.06.2013, 15:39 | #2 |
Участник
|
См. также \Reports\SalesPurchInvoice_RU\Methods\prepareDynamicSection
|
|
28.02.2014, 10:26 | #3 |
Участник
|
Предлагаю свое решение
Вот мое решение (для MS DAX 2009)
1. Ставим во всех контролах Section Body, которая у нас является строкой height = auto. DynamicHeight никому не ставим 2. У самой Section Body height также ставим auto 3. В перекрытом методе executeSection пишем такой код X++: public void executeSection() { Integer offset = 200; //смещение, если оно нужно //Например: из двух полей, у которых может быть переменная длина выбираем то, которое наибольшее Integer Height1 = PlanTable.height100mm(GetCrew.heightOfWordWrappedString100mm(Schedule.GetCrew())); Integer Height2 = PlanTable.height100mm(GetRoute.heightOfWordWrappedString100mm(Schedule.GetRoute())); Integer resultHeight = (Height1 > Height2? Height1 :Height2) + offset; Integer i = PlanTable.controlCount(); //Перебираем контролы и меняем им высоту while (i) { PlanTable.controlNo(i).height100mm(resultHeight); i--; } super(); } |
|
|
|