【发布时间】:2021-05-17 15:16:34
【问题描述】:
我在 Reza Aghaei 的帮助下创建了一个 DLL
这是 C# 代码(我从Print RDLC Report without showing ReportViewer Control 获得):
using Microsoft.Reporting.WinForms;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Imaging;
using System.Drawing.Printing;
using System.IO;
public static class LocalReportExtensions
{
public static void Print(this LocalReport report)
{
var pageSettings = new PageSettings();
pageSettings.PaperSize = report.GetDefaultPageSettings().PaperSize;
pageSettings.Landscape = report.GetDefaultPageSettings().IsLandscape;
pageSettings.Margins = report.GetDefaultPageSettings().Margins;
Print(report, pageSettings);
}
public static void Print(this LocalReport report, PageSettings pageSettings)
{
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>";
Warning[] warnings;
var streams = new List<Stream>();
var currentPageIndex = 0;
report.Render("Image", deviceInfo,
(name, fileNameExtension, encoding, mimeType, willSeek) =>
{
var stream = new MemoryStream();
streams.Add(stream);
return stream;
}, out warnings);
foreach (Stream stream in streams)
stream.Position = 0;
if (streams == null || streams.Count == 0)
throw new Exception("Error: no stream to print.");
var printDocument = new PrintDocument();
printDocument.DefaultPageSettings = pageSettings;
if (!printDocument.PrinterSettings.IsValid)
throw new Exception("Error: cannot find the default printer.");
else
{
printDocument.PrintPage += (sender, e) =>
{
Metafile pageImage = new Metafile(streams[currentPageIndex]);
Rectangle adjustedRect = 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, adjustedRect);
e.Graphics.DrawImage(pageImage, adjustedRect);
currentPageIndex++;
e.HasMorePages = (currentPageIndex < streams.Count);
e.Graphics.DrawRectangle(Pens.Red, adjustedRect);
};
printDocument.EndPrint += (Sender, e) =>
{
if (streams != null)
{
foreach (Stream stream in streams)
stream.Close();
streams = null;
}
};
printDocument.Print();
}
}
}
在 Reza Aghaei 提到的 C# 中,函数被调用
this.reportViewer1.LocalReport.Print();
我参考并尝试在 vb.net 中调用它
如果我尝试
this.reportViewer1.LocalReport.Print()
或
LocalReport.Print()
它给出了错误。
我缺少什么请提供帮助,或者如果专家可以在 Vb.net 中转换它,那将不胜感激。
我做的收据是这样的。
如果有专家帮助我解决这个问题,我将不胜感激,因为我主要在 VB.net 中工作。
【问题讨论】:
-
错误是什么?这是哪个版本的 C#?
-
VB.NET 还是 C#?您的项目使用哪种语言?
-
先生,我正在为我的项目使用 Vb.net。如果我能得到它的 Dll 或 vb.net 转换代码来使用,那就太好了。
-
在 C# 中发现错误是因为“@”之前的“$”,所以我删除了它。我已经编辑了这个问题,如果它得到解决,将会有很大帮助。
-
我认为你应该导入 LocalReportExtensions 的命名空间。 This is 扩展方法在 c# 中的工作原理
标签: c# vb.net winforms report rdlc