Доброго времени суток!
Помогите победить проблему: не меняется расположение компонентов в отчёте при определённых условиях.
Создаю "объединённый" отчёт из нескольких отчётов приведённым выше способом.
Т.к. отчёты могут быть разной ориентации, то я поворачиваю чётные страницы ландшафтной ориентации на 180 градусов, чтобы правильно печаталось на принтере с дуплексом.
Код: Выделить всё
foreach (StiPage page in report.RenderedPages)
{
pageNumber++;
// We need only EVEN and Landscape pages only!!!
if ((page.Orientation != StiPageOrientation.Landscape) || (pageNumber % 2 == 1))
{
continue;
}
report.RenderedPages.GetPage(page);
double pageWidth = page.Width;
double pageHeight = page.Height;
page.DisplayRectangle = new Stimulsoft.Base.Drawing.RectangleD(0, 0, page.DisplayRectangle.Height, page.DisplayRectangle.Width);
System.Collections.Hashtable newComps = new System.Collections.Hashtable();
foreach (StiComponent comp in page.Components)
{
compCount++;
Stimulsoft.Base.Drawing.RectangleD compRect = comp.DisplayRectangle;
Stimulsoft.Base.Drawing.RectangleD newRect;
newRect = new Stimulsoft.Base.Drawing.RectangleD(
pageWidth - compRect.Right,
pageHeight - compRect.Bottom,
compRect.Width,
compRect.Height
);
comp.DisplayRectangle = newRect;
IStiEnumAngle angleComp = comp as IStiEnumAngle;
if (angleComp != null)
{
StiAngle angle = angleComp.Angle;
angle = StiAngle.Angle180;
angleComp.Angle = angle;
}
StiText stiText = comp as StiText;
if (stiText != null)
{
stiText.Angle = 180;
}
StiImage image = comp as StiImage;
if (image != null)
{
image.ImageRotation = StiImageRotation.Rotate180;
}
IStiBorder border = comp as IStiBorder;
if (border != null)
{
if (border.Border is Stimulsoft.Base.Drawing.StiAdvancedBorder)
{
Stimulsoft.Base.Drawing.StiAdvancedBorder advBorder = border.Border as Stimulsoft.Base.Drawing.StiAdvancedBorder;
Stimulsoft.Base.Drawing.StiAdvancedBorder newBorder = new Stimulsoft.Base.Drawing.StiAdvancedBorder(
new Stimulsoft.Base.Drawing.StiBorderSide(advBorder.BottomSide.Color, advBorder.BottomSide.Size, advBorder.BottomSide.Style),
new Stimulsoft.Base.Drawing.StiBorderSide(advBorder.TopSide.Color, advBorder.TopSide.Size, advBorder.TopSide.Style),
new Stimulsoft.Base.Drawing.StiBorderSide(advBorder.RightSide.Color, advBorder.RightSide.Size, advBorder.RightSide.Style),
new Stimulsoft.Base.Drawing.StiBorderSide(advBorder.LeftSide.Color, advBorder.LeftSide.Size, advBorder.LeftSide.Style),
advBorder.DropShadow,
advBorder.ShadowSize,
advBorder.ShadowBrush);
border.Border = newBorder;
}
else
{
Stimulsoft.Base.Drawing.StiBorder oldBorder = border.Border;
Stimulsoft.Base.Drawing.StiBorder newBorder = (Stimulsoft.Base.Drawing.StiBorder)oldBorder.Clone();
newBorder.Side = Stimulsoft.Base.Drawing.StiBorderSides.None;
if (oldBorder.IsTopBorderSidePresent) newBorder.Side |= Stimulsoft.Base.Drawing.StiBorderSides.Bottom;
if (oldBorder.IsBottomBorderSidePresent) newBorder.Side |= Stimulsoft.Base.Drawing.StiBorderSides.Top;
if (oldBorder.IsRightBorderSidePresent) newBorder.Side |= Stimulsoft.Base.Drawing.StiBorderSides.Left;
if (oldBorder.IsLeftBorderSidePresent) newBorder.Side |= Stimulsoft.Base.Drawing.StiBorderSides.Right;
border.Border = newBorder;
}
}
if (comp is StiVerticalLinePrimitive)
{
StiHorizontalLinePrimitive horLine = new StiHorizontalLinePrimitive();
horLine.Parent = comp.Parent;
horLine.DisplayRectangle = newRect;
newComps[comp] = horLine;
}
if (comp is StiHorizontalLinePrimitive)
{
StiVerticalLinePrimitive vertLine = new StiVerticalLinePrimitive();
vertLine.Parent = comp.Parent;
vertLine.DisplayRectangle = newRect;
newComps[comp] = vertLine;
}
}
if (newComps.Count > 0)
{
foreach (System.Collections.DictionaryEntry de in newComps)
{
int compIndex = page.Components.IndexOf((StiComponent)de.Key);
page.Components[compIndex] = (StiComponent)de.Value;
}
}
}
Всё работает хорошо, пока не попалось так, что один и тот же отчёт не попал дважды в объединённый отчёт. В этом случае компоненты оказываются перевёрнутыми правильно, но расположение не переворачивается.
Т.е. как бы DisplayRectangle у компонентов не меняется, а StiAngle.Angle180 ставится.
У меня есть предположение, что необходимо подменить ID компонентов, чтобы они не пересекались. Но как это сделать, я не нашёл.
Заранее спасибо.