Печать отчета SSRS в альбомном режиме из приложения Windows Forms
У меня есть приложение Windows Forms, которое имеет textbox
, button
и 3 ReportViewer
, 3 ReportViewer
коробки спрятаны. Когда вы вводите ShopOrder
в текстовое поле и нажмите на кнопку, он автоматически передаст значение заказа магазина в качестве параметра всем трем отчетам, отобразит отчет, и после его завершения отобразит отчет в виде файла EMF, распечатает отчет.
У меня есть несколько отклонений в моем приложении, потому что я использую ServerReports
в моем ReportViewer
и не LocalReport
, Но после всех этих изменений мое приложение печатает их все без проблем.
Но единственная проблема, с которой я столкнулся, заключается в том, что я не могу установить ориентацию страницы на Landscape
, хотя ориентация в моем отчете - Пейзаж.
Поэтому я подумал, может быть, мне нужно установить deviceInfo
переменной PageWidth
а также PageHeight
переменные соответственно, так что это то, что deviceInfo
переменная имеет:
string deviceInfo =
@"<DeviceInfo>
<OutputFormat>EMF</OutputFormat>
<PageWidth>11in</PageWidth>
<PageHeight>8.5in</PageHeight>
<MarginTop>0.25in</MarginTop>
<MarginLeft>0.25in</MarginLeft>
<MarginRight>0.25in</MarginRight>
<MarginBottom>0.25in</MarginBottom>
</DeviceInfo>";
У меня два Export
функции: Export
а также ExportLandscape
, Приведенный выше фрагмент кода является частью ExportLandscape
, Когда я звоню ExportLandscape
Мой отчет все еще печатает в портрете.
Я попытался просто полностью удалить параметры настройки страницы из моего DeviceInfo
переменная и сделал это просто сказать OutputFormat
, Это тоже не делало.
Есть ли еще что-то, что мне нужно изменить, чтобы мой отчет печатался в альбомной ориентации? Что мне не хватает?
Также стоит отметить, что из 3 моих докладов 2 из них печатаются в альбомной ориентации, а 1 - в портретной. Поэтому мне бы очень хотелось, чтобы мое приложение просто распечатывало его при любых настройках страницы, в которых находится отчет. Я просто попытался получить размер страницы отчета и поля отчета и установить их для своего DeviceInfo
переменная, как предлагается здесь. ВСЕМ НЕ УДАЧИ!!
Я просто попытался добавить точку останова на Export(ReportViewer report)
функционировать и перешагнул. Когда я получу report.ServerReport.GetDefaultPageSettings().PaperSize
в ближайшем окне я вижу это:
{[PaperSize Letter Kind=Letter Height=1100 Width=850]}
Height: 1100
Kind: Letter
PaperName: "Letter"
RawKind: 1
Width: 850
Это заставляет меня чувствовать, что, хотя мой отчет настроен на альбомную ориентацию (высота = 8,5 дюйма и ширина = 11 дюймов), мое приложение, похоже, не распознает его.
Важное обновление:
Принтер, на котором я печатаю, имеет 2 лотка для бумаги. Когда я печатаю портретный отчет, он берется из лотка по умолчанию с размером бумаги по умолчанию (лоток 2). Но когда мое приложение отправляет отчет о горизонтальной ориентации на печать, принтер пытается вытащить бумагу из лотка 1. Когда я загружаю в лоток 1 ту же бумагу, что и в лотке 2, он просит ввести ширину и высоту бумаги., Кажется, принтер не понимает, когда я говорю, чтобы он печатал в альбомной ориентации. Или, скорее, принтер думает, что это какая-то новая настройка, о которой он не знает. Когда я ввожу 11 для ширины и 8,5 для высоты, он печатает данные ландшафта на портретной бумаге.
Для большей ясности данные печатаются шириной 11 и высотой 8,5. АКА, только 75% данных печатаются. Остальное выталкивается со страницы, потому что страница все еще ориентирована в портретной ориентации.
1 ответ
Вам нужно использовать подходящий PageSettings
для PrintDocument
который используется для печати. Вам необходимо внести некоторые изменения в код этой статьи, чтобы иметь возможность печатать на бумаге другого размера или разметки страницы.
Для начала нужно создать подходящий PageSettings
Например, если вы установили настройку страницы по умолчанию для своего отчета в альбомной ориентации:
var report = reportViewer1.LocalReport;
var pageSettings = new PageSettings();
pageSettings.PaperSize = report.GetDefaultPageSettings().PaperSize;
pageSettings.Landscape = report.GetDefaultPageSettings().IsLandscape;
pageSettings.Margins = report.GetDefaultPageSettings().Margins;
или если вы хотите создать новый параметр страницы:
var pageSettings = new PageSettings();
pageSettings.Landscape = true;
pageSettings.PaperSize = reportViewer1.PrinterSettings.PaperSizes.Cast<PaperSize>()
.Where(x => x.Kind == PaperKind.A4).First();
Затем используйте pageSetting
при создании deviceInfo:
string deviceInfo =
$@"<DeviceInfo>
<OutputFormat>EMF</OutputFormat>
<PageWidth>{pageSettings.PaperSize.Width * 100}in</PageWidth>
<PageHeight>{pageSettings.PaperSize.Height * 100}in</PageHeight>
<MarginTop>{pageSettings.Margins.Top * 100}in</MarginTop>
<MarginLeft>{pageSettings.Margins.Left * 100}in</MarginLeft>
<MarginRight>{pageSettings.Margins.Right * 100}in</MarginRight>
<MarginBottom>{pageSettings.Margins.Bottom * 100}in</MarginBottom>
</DeviceInfo>";
И наконец, используйте те же настройки страницы с PrintDocument
:
PrintDocument printDoc = new PrintDocument();
printDoc.DefaultPageSettings = pageSettings;
Я создал метод расширения, чтобы упростить печать отчета путем вызова Print()
или же Print(PageSettings)
, Вы можете найти его здесь: Печать отчета RDLC без отображения ReportViewer