Я использую элемент управления ReportViewer для своих отчетов, и пользователям требуются функции поиска, которые уже есть в Reportviewer, а также функции печати «текущей страницы», которые Microsoft не включила, поэтому я сам написал… Проблема в том, чточто в обычном режиме все связанные данные объединяются на одной странице и на страницах предварительного просмотра имеют разрыв страницы.Это приводит к тому, что номера страниц в режиме «Нормальный» и «Предварительный просмотр» не совпадают, поскольку при переключении этих режимов ReportViewer отображается по-разному.Поэтому, когда я пытаюсь напечатать текущую страницу, например, «19» в обычном режиме, я получу распечатанную страницу «19» из режима предварительного просмотра, и это не то, что вы видите на экране.
Есть ли что-нибудь, что яможно сделать - изменить проект .rdlc таким образом, чтобы в обычном режиме страницы ломались так же, как при предварительном просмотре?Или получить потоковое изображение того, что я вижу на экране, и распечатать это? .... Любая помощь любезно оценена, я изо всех сил пытаюсь найти что-нибудь, чтобы решить эту проблему, но пока безуспешно ...
РЕДАКТИРОВАТЬ: Мой класс для печати текущей страницы в ReportViewer.Это может кому-то помочь, это работает для режима предварительного просмотра, но не для обычного режима. Если ваши связанные данные настолько велики, что страницы имеют разрыв страницы - потому что потоковое изображение, которое используется для печати текущей страницы, фактически копирует то, что вы установили в проекте отчета .rdlc- в моем случае размер бумаги A4:
class TiskanjeTrenutneStrani : PrintDocument
{
private PageSettings nastavitve_strani;
private int stran_za_tiskanje;
private List<Stream> strani_reporta = new List<Stream>();
public TiskanjeTrenutneStrani(LocalReport localReport, int stran)
: this((Report)localReport)
{
//Set page for printing
stran_za_tiskanje = stran-1;
RenderirajStraniIzpisa(localReport);
}
private TiskanjeTrenutneStrani(Report report)
{
//Set page as defined in report project
ReportPageSettings nastavitve_Report_Strani = report.GetDefaultPageSettings();
var nastavitve_strani = new PageSettings
{
PaperSize = nastavitve_Report_Strani.PaperSize,
Margins = nastavitve_Report_Strani.Margins
};
}
protected override void Dispose(bool disposing)
{
base.Dispose(disposing);
if (disposing)
{
foreach (Stream s in strani_reporta)
{
s.Dispose();
}
strani_reporta.Clear();
}
}
protected override void OnPrintPage(PrintPageEventArgs e)
{
base.OnPrintPage(e);
Stream TiskanaStran = strani_reporta[stran_za_tiskanje];
TiskanaStran.Position = 0;
// Load each page into a Metafile to draw it.
using (Metafile pageMetaFile = new Metafile(TiskanaStran))
{
Rectangle rc = new Rectangle(
e.PageBounds.Left - (int)e.PageSettings.HardMarginX,
e.PageBounds.Top - (int)e.PageSettings.HardMarginY,
e.PageBounds.Width,
e.PageBounds.Height);
e.Graphics.FillRectangle(Brushes.White, rc);
e.Graphics.DrawImage(pageMetaFile, rc);
}
}
protected override void OnQueryPageSettings(QueryPageSettingsEventArgs e)
{
e.PageSettings = (PageSettings)nastavitve_strani.Clone();
}
private void RenderirajStraniIzpisa(LocalReport localReport)
{
string deviceInfo = CreateEMFDeviceInfo();
localReport.Render("IMAGE", deviceInfo, LocalReportCreateStreamCallback, out Warning[] warnings);
}
private Stream LocalReportCreateStreamCallback(string name, string extension, Encoding encoding, string mimeType, bool willSeek)
{
MemoryStream stream = new MemoryStream();
strani_reporta.Add(stream);
return stream;
}
private string CreateEMFDeviceInfo()
{
PaperSize velikost_papirja = nastavitve_strani.PaperSize;
Margins margins = nastavitve_strani.Margins;
// The device info string defines the page range to print as well as the size of the page.
// A start and end page of 0 means generate all pages.
return
string.Format(CultureInfo.InvariantCulture,
"<DeviceInfo><OutputFormat>emf</OutputFormat><StartPage>0</StartPage><EndPage>0</EndPage><MarginTop>{0}</MarginTop><MarginLeft>{1}</MarginLeft><MarginRight>{2}</MarginRight><MarginBottom>{3}</MarginBottom><PageHeight>{4}</PageHeight><PageWidth>{5}</PageWidth></DeviceInfo>",
ToInches(margins.Top),
ToInches(margins.Left),
ToInches(margins.Right),
ToInches(margins.Bottom),
ToInches(velikost_papirja.Height),
ToInches(velikost_papirja.Width));
}
private static string ToInches(int hundrethsOfInch)
{
double inches = hundrethsOfInch / 100.0;
return inches.ToString(CultureInfo.InvariantCulture) + "in";
}
}
Использование:
TiskanjeTrenutneStrani tiskaj_stran = new
TiskanjeTrenutneStrani(this.LocalReport, this.CurrentPage);
tiskaj_stran.Print(); // And It prints current page - unfortunally not what you see on screen If in normal mode