Visual Studio 2015 社区报告查看器版本 12 使用 c# 获取额外保证金时出错

Imr*_*han 5 c# sql-server rdlc

我正在使用 Visual Studio 2015 社区报告查看器版本 12 在我的 c# 项目中显示 rdlc 报告。这是正常的 A4 页面报告

Windows 7 上的正常图像

它适用于客户端 PC 上的 windows xp、vista、win 7,但是当在 Windows 10 64 位上安装相同的应用程序时,我面临如下问题

Windows 10 中的错误

正如您在上图中所看到的,右侧和底部出现了不必要的边距,并且字体大小也减小了。但是当我将报告导出为 PDF 时,生成的 PDF 没有问题,它与我设计的报告相同。

我试过什么:

  1. 我从https://www.microsoft.com/en-us/download/details.aspx?id=45496安装了 MICROSOFT® REPORT VIEWER 2015 RUNTIME
  2. 已安装 Microsoft® SQL Server® 2014 Feature Pack(SQL Server 2014 的系统 CLR 类型)
  3. 尝试使用以下代码将 RDLC 直接导出到打印机

打印类代码

public static class _cWainfoPrintReport
    {
        private static int m_currentPageIndex;
        private static IList<Stream> m_streams;
        public static Stream CreateStream(string name,
        string fileNameExtension, Encoding encoding,
        string mimeType, bool willSeek)
        {
            Stream stream = new MemoryStream();
            m_streams.Add(stream);
            return stream;
        }
        public static void _mExport(LocalReport report, bool print = true, double _pageWightInches = 8.27, double _pageHeightInches = 11.69, double _MarginTopInches = 0.025, double _MarginLeftInches = 0.025, double _MarginRightInches = 0.025, double _MarginBottomInches = 0.025)
        {
            string deviceInfo =
            @"<DeviceInfo> <OutputFormat>EMF</OutputFormat> <PageWidth>" + _pageWightInches + "in</PageWidth> <PageHeight>" + _pageHeightInches + "in</PageHeight> <MarginTop>" + _MarginTopInches + "in</MarginTop> <MarginLeft>" + _MarginLeftInches + "in</MarginLeft> <MarginRight>" + _MarginRightInches + "in</MarginRight> <MarginBottom>" + _MarginBottomInches + "in</MarginBottom> </DeviceInfo>";
            Warning[] warnings;
            m_streams = new List<Stream>();
            report.Render("Image", deviceInfo, CreateStream,
            out warnings);
            foreach (Stream stream in m_streams)
                stream.Position = 0;
            if (print)
            {
                _mPrint(_pageWightInches, _pageHeightInches, _MarginTopInches, _MarginLeftInches, _MarginRightInches, _MarginBottomInches);
            }
            report.ReleaseSandboxAppDomain();
        }
        // Handler for PrintPageEvents
        public static void _mPrintPage(object sender, PrintPageEventArgs ev)
        {
            Metafile pageImage = new
            Metafile(m_streams[m_currentPageIndex]);
            // Adjust rectangular area with printer margins.
            Rectangle adjustedRect = new Rectangle(
            ev.PageBounds.Left - (int)ev.PageSettings.HardMarginX,
            ev.PageBounds.Top - (int)ev.PageSettings.HardMarginY,
            ev.PageBounds.Width,
            ev.PageBounds.Height);
            // Draw a white background for the report
            ev.Graphics.FillRectangle(Brushes.White, adjustedRect);
            // Draw the report content
            ev.Graphics.DrawImage(pageImage, adjustedRect);
            // Prepare for the next page. Make sure we haven't hit the end.
            m_currentPageIndex++;
            ev.HasMorePages = (m_currentPageIndex < m_streams.Count);
        }
        public static PaperSize CalculatePaperSize(double WidthInCentimeters, double HeightInCentimetres)
        {
            int Width = int.Parse((Math.Round((WidthInCentimeters * 0.393701) * 100, 0, MidpointRounding.AwayFromZero)).ToString());
            int Height = int.Parse((Math.Round((HeightInCentimetres * 0.393701) * 100, 0, MidpointRounding.AwayFromZero)).ToString());

            PaperSize NewSize = new PaperSize();
            NewSize.RawKind = (int)PaperKind.Custom;
            NewSize.Width = Width;
            NewSize.Height = Height;
            NewSize.PaperName = "Letter";

            return NewSize;

        }
        public static void _mPrint(double _pageWightInches = 8.27, double _pageHeightInches = 11.69, double _MarginTopInches = 0.025, double _MarginLeftInches = 0.025, double _MarginRightInches = 0.025, double _MarginBottomInches = 0.025)
        {
            if (m_streams == null || m_streams.Count == 0)
                throw new Exception("Error: no stream to print.");
            PrintDocument printDoc = new PrintDocument();

            PaperSize RequiredPaperSize = CalculatePaperSize(_pageWightInches * 2.54, _pageHeightInches * 2.54);
            bool FoundMatchingPaperSize = false;
            for (int index = 0; index < printDoc.PrinterSettings.PaperSizes.Count; index++)
            {
                if (printDoc.PrinterSettings.PaperSizes[index].Height == RequiredPaperSize.Height && printDoc.PrinterSettings.PaperSizes[index].Width == RequiredPaperSize.Width)
                {
                    printDoc.PrinterSettings.DefaultPageSettings.PaperSize = printDoc.PrinterSettings.PaperSizes[index];
                    printDoc.DefaultPageSettings.PaperSize = printDoc.PrinterSettings.PaperSizes[index];
                    FoundMatchingPaperSize = true;
                    break;
                }
            }


            if (!printDoc.PrinterSettings.IsValid)
            {
                throw new Exception("Error: cannot find the default printer.");
            }
            else
            {

                printDoc.PrintPage += new PrintPageEventHandler(_mPrintPage);
                m_currentPageIndex = 0;
                printDoc.Print();
            }
        }
        public static void _mPrintToPrinter(this LocalReport report)
        {
            _mExport(report);
        }
        public static void _mDisposePrint()
        {
            if (m_streams != null)
            {
                foreach (Stream stream in m_streams)
                    stream.Close();
                m_streams = null;
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

打印按钮上的代码

PrintViewer _PJobEntry = new PrintViewer();
DataTable dt = new DataSet1.MainTableDataTable();
dt.Rows.Add('vales for dataset');
_PJobEntry._RptView.LocalReport.DataSources.Add(new ReportDataSource("DataSet1", dt));
_PJobEntry._RptView.LocalReport.ReportEmbeddedResource = "WAINFOBUSSOLN.Printing.RptSaleInvoice02.rdlc";
_PJobEntry._RptView.SetDisplayMode(DisplayMode.PrintLayout);
_cWainfoPrintReport._mExport(_PJobEntry._RptView.LocalReport, true, 8.27, 11.69, 0.25, 0.25, 0.28, 0.25);
Run Code Online (Sandbox Code Playgroud)

但它的打印也与上述相同

相同的应用程序在我的装有 Windows 10 64 位的 PC 上运行,但在装有 Windows 10 64 位的客户端 PC 上部署后无法运行

在客户端 PC .Net 4.0 框架上,SQL Server 2008,安装了 Windows 10 64 位

如何解决。

dj0*_*079 2

我不认为这个问题与安装的任何工具有任何关系,或者仅与 Windows 10 64 位有关,特别是与此有关。

相反,这是 jdweng 和 Reza Aghaei 提到的 DPI 问题。更具体地说,是高 DPI 设备。

不确定您是否注意到,您上传的图像具有不同的像素,并且低像素的图像显示了报告的正确渲染。这可以说支持了由于高 DPI 引起的缩放问题的观点。

高 DPI_Scaling_Issue

现在,有很多关于此的文章、帖子和问题。但最接近为受害者提供某种正确方向的是 Microsoft 支持门户网站,该门户网站似乎几乎没有为这种行为提供可能的解决方案(是的,复数)和解决方法(再次,复数)。

您可以在这里找到这篇文章:https://support.microsoft.com/en-au/help/3025083/windows-scaling-issues-for-high-dpi-devices

我相信,我在下面引用的解决方法应该暂时对您有所帮助。

更改应用程序属性

在资源管理器或“开始”菜单中,右键单击应用程序名称,选择“属性”,选择“兼容性”选项卡,然后选中“在高 DPI 设置时禁用显示缩放”复选框。

注意: 在 Windows 10 版本 1703 及更高版本的 Windows 中,禁用高 DPI 设置上的显示缩放选项的文本更改为覆盖高 DPI 缩放行为,缩放执行者:应用程序。