C# RDLC报表不出现预览窗体直接输出到打印机
标签:ini oom ble except nali inf coding 直接 pap
#region 直接打印区域
///
/// 直接打印到打印机
///
///
///
///
///
///
///
///
///
///
///
///
///
///
///
///
public void PrintReportDrc(string reportFullFileName, string reportTitle, DataTable reportDSTable1,
DataTable reportDSTable2 = null, DataTable reportDSTable3 = null, DataTable reportDSTable4 = null,
DataTable reportDSTable5 = null, bool hasSubReport = false, DataTable subReportDSTable1 = null,
DataTable subReportDSTable2 = null, System.Drawing.Printing.PageSettings tPageSettings = null, System.Drawing.Printing.PrinterSettings tPrinterSettings = null, string logoFileName1 = null, string logoFileName2 = null, string logoFileName3 = null)
{
if (!File.Exists(reportFullFileName))
{
MyMsg.Error("T.1201/指定的报表文件不存在,请检查!");
this.Close();
return;
}
this.Text += "(" + reportTitle + ")";
this.RptvMain.Reset();
this.RptvMain.ProcessingMode = ProcessingMode.Local;
this.RptvMain.LocalReport.ReportPath = reportFullFileName;//必须在前面,否则出现The source of the report definition has not been specified错误
this.RptvMain.LocalReport.EnableExternalImages = true; // RDLC报表显示本地图片必须设置(默认是关闭)
#region 处理参数
ReportParameterInfoCollection reportParameterInfos = RptvMain.LocalReport.GetParameters();
Liststring> parasNames = new Liststring>();
foreach (ReportParameterInfo rpi in reportParameterInfos)
{
parasNames.Add(rpi.Name);
}
List reportParameters = new List();
if (parasNames.Contains("LogoFile1"))
{
if (string.IsNullOrEmpty(logoFileName1))
{
logoFileName1 = "RptLogoDft1.jpg";
}
logoFileName1 = AppInfo.GetPath(AppInfo.AppPath.Report) + @"\Images\" + logoFileName1;
logoFileName1 = @"file:///" + logoFileName1.Replace(@"\", @"/");
ReportParameter reportParameter = new ReportParameter("LogoFile1", logoFileName1);
reportParameters.Add(reportParameter);
}
if (parasNames.Contains("LogoFile2"))
{
if (string.IsNullOrEmpty(logoFileName2))
{
logoFileName2 = "RptLogoDft2.jpg";
}
logoFileName2 = AppInfo.GetPath(AppInfo.AppPath.Report) + @"\Images\" + logoFileName2;
logoFileName2 = @"file:///" + logoFileName2.Replace(@"\", @"/");
ReportParameter reportParameter = new ReportParameter("LogoFile2", logoFileName2);
reportParameters.Add(reportParameter);
}
if (parasNames.Contains("LogoFile3"))
{
if (string.IsNullOrEmpty(logoFileName3))
{
logoFileName3 = "RptLogoDft3.jpg";
}
logoFileName3 = AppInfo.GetPath(AppInfo.AppPath.Report) + @"\Images\" + logoFileName3;
logoFileName3 = @"file:///" + logoFileName3.Replace(@"\", @"/");
ReportParameter reportParameter = new ReportParameter("LogoFile3", logoFileName3);
reportParameters.Add(reportParameter);
}
if (reportParameters.Count > 0)
{
this.RptvMain.LocalReport.SetParameters(reportParameters);
}
#endregion
#region 处理Dataset
this.RptvMain.LocalReport.DataSources.Clear();
if (reportDSTable1 != null)
{
ReportDataSource rds1 = new ReportDataSource("DataSet1", reportDSTable1);
this.RptvMain.LocalReport.DataSources.Add(rds1);
}
if (reportDSTable2 != null)
{
ReportDataSource rds2 = new ReportDataSource("DataSet2", reportDSTable2);
this.RptvMain.LocalReport.DataSources.Add(rds2);
}
if (reportDSTable3 != null)
{
ReportDataSource rds3 = new ReportDataSource("DataSet3", reportDSTable3);
this.RptvMain.LocalReport.DataSources.Add(rds3);
}
if (reportDSTable4 != null)
{
ReportDataSource rds4 = new ReportDataSource("DataSet4", reportDSTable4);
this.RptvMain.LocalReport.DataSources.Add(rds4);
}
if (reportDSTable5 != null)
{
ReportDataSource rds5 = new ReportDataSource("DataSet5", reportDSTable5);
this.RptvMain.LocalReport.DataSources.Add(rds5);
}
#endregion
//定义子报表处理方法
if (hasSubReport)
{
subDSTable1 = subReportDSTable1;
subDSTable2 = subReportDSTable2;
RptvMain.LocalReport.SubreportProcessing += new SubreportProcessingEventHandler(LocalReport_SubreportProcessing);
}
RptvMain.SetDisplayMode(DisplayMode.PrintLayout);
RptvMain.ZoomMode = ZoomMode.Percent;
RptvMain.ZoomPercent = 100;
try
{
if (tPageSettings != null) RptvMain.SetPageSettings(tPageSettings);
if (tPrinterSettings != null) RptvMain.PrinterSettings = tPrinterSettings;
}
catch (Exception)
{
}
RptvMain.LocalReport.Refresh();
RptvMain.RefreshReport();
#region 直接打印定义
m_streams = new List();
ReportPageSettings pageSettings = RptvMain.LocalReport.GetDefaultPageSettings();
decimal pgWidth = decimal.Round(HpString.NZ2Decimal(pageSettings.PaperSize.Width * 2.54 / 100), 2);
decimal pgHeight = decimal.Round(HpString.NZ2Decimal(pageSettings.PaperSize.Height * 2.54 / 100), 2);
decimal mgTop = decimal.Round(HpString.NZ2Decimal(pageSettings.Margins.Top * 2.54 / 100), 2);
decimal mgLeft = decimal.Round(HpString.NZ2Decimal(pageSettings.Margins.Left * 2.54 / 100), 2);
decimal mgRight = decimal.Round(HpString.NZ2Decimal(pageSettings.Margins.Right * 2.54 / 100), 2);
decimal mgBottom = decimal.Round(HpString.NZ2Decimal(pageSettings.Margins.Bottom * 2.54 / 100), 2);
string deviceInfo = "" +
" EMF" +
" "+ pgWidth + "cm" +
" " + pgHeight + "cm" +
" " + mgTop + "cm" +
" " + mgLeft + "cm" +
" " + mgRight + "cm" +
" " + mgBottom + "cm" +
"";
RptvMain.LocalReport.Render("Image", deviceInfo, CreateStream, out Warning[] warnings);
//==================================================开始打印
m_currentPageIndex = 0;
if (m_streams == null || m_streams.Count == 0)
return;
//声明PrintDocument对象用于数据的打印
PrintDocument printDoc = new PrintDocument
{
DefaultPageSettings = RptvMain.GetPageSettings()
};
//如果没有指定打印机设置,则使用空字符串""来指定默认打印机
if (RptvMain.PrinterSettings == null)
{
printDoc.PrinterSettings.PrinterName = "";
}
else
{
printDoc.PrinterSettings = RptvMain.PrinterSettings;
}
//判断指定的打印机是否可用
if (!printDoc.PrinterSettings.IsValid)
{
MyMsg.Warning("没有找到指定的打印机:" + printDoc.PrinterSettings.PrinterName);
return;
}
printDoc.PrintPage += new PrintPageEventHandler(PrintPage);
//执行打印操作,Print方法将触发PrintPage事件。
printDoc.Print();
//释放资源
foreach (Stream stream in m_streams)
{
stream.Dispose();
stream.Close();
}
m_streams = null;
#endregion
}
//声明一个Stream对象的列表用来保存报表的输出数据
//LocalReport对象的Render方法会将报表按页输出为多个Stream对象。
private List m_streams;
//用来提供Stream对象的函数,用于LocalReport对象的Render方法的第三个参数。
private Stream CreateStream(string name, string fileNameExtension, Encoding encoding, string mimeType, bool willSeek)
{
//如果需要将报表输出的数据保存为文件,请使用FileStream对象。
Stream stream = new MemoryStream();
m_streams.Add(stream);
return stream;
}
//用来记录当前打印到第几页了
private int m_currentPageIndex;
#region 打印页面
private void PrintPage(object sender, PrintPageEventArgs ev)
{
m_streams[m_currentPageIndex].Position = 0;
Metafile pageImage = new Metafile(m_streams[m_currentPageIndex]);
System.Drawing.Rectangle adjustedRect = new System.Drawing.Rectangle(
ev.PageBounds.Left - (int)ev.PageSettings.HardMarginX,
ev.PageBounds.Top - (int)ev.PageSettings.HardMarginY, ev.PageBounds.Width, ev.PageBounds.Height);
ev.Graphics.FillRectangle(System.Drawing.Brushes.White, adjustedRect);
ev.Graphics.DrawImage(pageImage, adjustedRect);
m_streams[m_currentPageIndex].Close();
m_currentPageIndex++;
ev.HasMorePages = (m_currentPageIndex m_streams.Count);
}
#endregion
#endregion
C# RDLC报表不出现预览窗体直接输出到打印机
标签:ini oom ble except nali inf coding 直接 pap
原文地址:https://www.cnblogs.com/imes/p/10398279.html
评论