ReportEngine.Reprint.cs 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. using System.Collections.Generic;
  2. namespace FastReport.Engine
  3. {
  4. public partial class ReportEngine
  5. {
  6. #region Fields
  7. private List<BandBase> reprintHeaders;
  8. private List<BandBase> keepReprintHeaders;
  9. private List<BandBase> reprintFooters;
  10. private List<BandBase> keepReprintFooters;
  11. #endregion Fields
  12. #region Private Methods
  13. private void InitReprint()
  14. {
  15. reprintHeaders = new List<BandBase>();
  16. keepReprintHeaders = new List<BandBase>();
  17. reprintFooters = new List<BandBase>();
  18. keepReprintFooters = new List<BandBase>();
  19. }
  20. private void ShowReprintHeaders()
  21. {
  22. float saveOriginX = originX;
  23. foreach (BandBase band in reprintHeaders)
  24. {
  25. band.Repeated = true;
  26. originX = band.ReprintOffset;
  27. ShowBand(band);
  28. band.Repeated = false;
  29. }
  30. originX = saveOriginX;
  31. }
  32. private void ShowReprintFooters()
  33. {
  34. ShowReprintFooters(true);
  35. }
  36. private void ShowReprintFooters(bool repeated)
  37. {
  38. float saveOriginX = originX;
  39. // show footers in reverse order
  40. for (int i = reprintFooters.Count - 1; i >= 0; i--)
  41. {
  42. BandBase band = reprintFooters[i];
  43. band.Repeated = repeated;
  44. band.FlagCheckFreeSpace = false;
  45. originX = band.ReprintOffset;
  46. ShowBand(band);
  47. band.Repeated = false;
  48. band.FlagCheckFreeSpace = true;
  49. }
  50. originX = saveOriginX;
  51. }
  52. private void AddReprint(BandBase band)
  53. {
  54. // save current offset and use it later when reprinting a band.
  55. // it is required when printing subreports
  56. band.ReprintOffset = originX;
  57. if (keeping)
  58. {
  59. if (band is DataHeaderBand || band is GroupHeaderBand)
  60. keepReprintHeaders.Add(band);
  61. else
  62. keepReprintFooters.Add(band);
  63. }
  64. else
  65. {
  66. if (band is DataHeaderBand || band is GroupHeaderBand)
  67. reprintHeaders.Add(band);
  68. else
  69. reprintFooters.Add(band);
  70. }
  71. }
  72. private void RemoveReprint(BandBase band)
  73. {
  74. if (keepReprintHeaders.Contains(band))
  75. keepReprintHeaders.Remove(band);
  76. if (reprintHeaders.Contains(band))
  77. reprintHeaders.Remove(band);
  78. if (keepReprintFooters.Contains(band))
  79. keepReprintFooters.Remove(band);
  80. if (reprintFooters.Contains(band))
  81. reprintFooters.Remove(band);
  82. }
  83. private void StartKeepReprint()
  84. {
  85. keepReprintHeaders.Clear();
  86. keepReprintFooters.Clear();
  87. }
  88. private void EndKeepReprint()
  89. {
  90. foreach (BandBase band in keepReprintHeaders)
  91. {
  92. reprintHeaders.Add(band);
  93. }
  94. foreach (BandBase band in keepReprintFooters)
  95. {
  96. reprintFooters.Add(band);
  97. }
  98. keepReprintHeaders.Clear();
  99. keepReprintFooters.Clear();
  100. }
  101. private float GetFootersHeight()
  102. {
  103. float result = 0;
  104. bool saveRepeated = false;
  105. foreach (BandBase band in reprintFooters)
  106. {
  107. saveRepeated = band.Repeated;
  108. band.Repeated = true;
  109. result += GetBandHeightWithChildren(band);
  110. band.Repeated = saveRepeated;
  111. }
  112. foreach (BandBase band in keepReprintFooters)
  113. {
  114. saveRepeated = band.Repeated;
  115. band.Repeated = true;
  116. result += GetBandHeightWithChildren(band);
  117. band.Repeated = saveRepeated;
  118. }
  119. return result;
  120. }
  121. #endregion Private Methods
  122. }
  123. }