打印 RDLC 报告而不显示 ReportViewer 控件

2024-02-09

我想知道是否可以发送/打印数据DataGridView直接到 rdlc 报告而不将其绑定到ReportViewercontrol.

有许多关于将 dgv 数据绑定到报告查看器控件的线程。 我不想创建另一个带有报表查看器控件的表单,而是使用带有数据的现有表单DataGridView并按打印按钮将数据发送到RDLC报告并打印。

是否可以?
Thanks


您可以使用以下命令以编程方式打印 RDLC 报告LocalReport https://learn.microsoft.com/en-us/previous-versions/ms255056(v=vs.140)?WT.mc_id=DT-MVP-5003235对象和CreateStreamCallback https://learn.microsoft.com/en-us/previous-versions/ms254645(v=vs.140)?WT.mc_id=DT-MVP-5003235回调函数。以下是完整的 Microsoft 文档演练,您可能会发现它很有用:

  • 演练:打印本地报告而不预览 https://learn.microsoft.com/en-us/previous-versions/ms252091(v=vs.140)?WT.mc_id=DT-MVP-5003235

为了方便使用,我创建了一个打印扩展方法 http://www.reza-aghaei.com/print-rdlc-report-without-showing-the-reportviewer/您可以这样轻松地使用它:

this.reportViewer1.LocalReport.Print();

这是扩展方法:

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();
        }
    }
}

显示打印对话框进行打印

以防万一有人想通过显示“打印”对话框进行打印,您可以放置​​一个ReportViewer在表格上并设置Visible将控件的属性设置为 false,然后将数据传递到报表,并且当RenderingComplete https://learn.microsoft.com/en-us/previous-versions/visualstudio/visual-studio-2010/ms251814(v=vs.100)?WT.mc_id=DT-MVP-5003235事件触发,调用PrintDialog:

  • ReportViewer.PrintDialog 方法 https://learn.microsoft.com/en-us/previous-versions/visualstudio/visual-studio-2010/ms252179(v=vs.100)?WT.mc_id=DT-MVP-5003235
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

打印 RDLC 报告而不显示 ReportViewer 控件 的相关文章

随机推荐

  • 从 pandas 数据框中制作多个饼图(每一行一个)

    我有一个数据框 df 显示与各种业务类别相关的情绪 我的任务是创建饼图 显示每种业务类型的情绪百分比 因此 我需要在 matplotlib 中创建一个函数 该函数读取 Business 列 然后使用数据框中每行的每个情感类别构建饼图 我已经
  • Wear OS 和 iOS 配套应用程序之间的直接通信

    我目前有一个适用于 Android 和 iOS 智能手机的应用程序 我想将其引入 Wear OS 和 Watch OS 由于 Wear OS 智能手表也与 iOS 设备兼容 因此我正在寻找一种在 Watch OS 应用程序和 iOS 应用程
  • 在表格/班级之间共享信息[重复]

    这个问题在这里已经有答案了 我知道标题问题并不独特 并且有很多可用的消息 我打开一个线程的原因是我真的很难根据我的项目来理解这个问题 最近 我尝试启动 WinForm 以从 REST API 获取值 就像在 Form1 上进行开始测试一样
  • 使用 dplyr::percent_rank() 计算组内的百分位数排名

    假设我有以下数据 id grpvar1 grpvar2 value 1 1 3 7 6 2 1 2 4 3 1 5 2 对于每个id 我想计算percent rank of its value在由组合定义的组内grpvar1 and grp
  • Windows ODBC 驱动程序 - 检索的表情符号数据呈现为?

    重复线程注释 我已经针对这个问题提出了类似的问题 通过 ODBC 连接检索的表情符号数据显示为问号 https stackoverflow com questions 58943772 emoji data retrieved via od
  • 聚合函数和其他列

    SQL 查询是否可以返回一些普通列和一些聚合列 like Col A Col B SUM 5 6 7 您应该使用按语句分组 http www w3schools com sql sql groupby asp GROUP BY 语句用于 与
  • 恢复活动时防止多次打开对话框

    在我的 Android 应用程序中 为了询问用户是否要恢复当前游戏 我在主游戏活动中显示一个对话框 显示 您要恢复当前游戏吗 是 否 问题是 如果我在不回答对话的情况下多次恢复此活动 那么我会收到几个对话 一个个对话 这显然不是我的目标 我
  • 如何将 XPath 与 AS3 结合使用并获得仍然引用 XMLDocument 对象的结果?

    我正在将 XML 字符串解析为 XMLDocument 对象 我想使用 XPath 技术搜索特定节点XPathQuery execQuery 此函数返回新的 XML 对象 这意味着我需要将其转换为不同的 XMLDocument 对象并丢失引
  • 升级到 Grails 2.4.4 的问题

    从 Grails 2 4 3 升级到 2 4 4 后 启动 Grails 应用程序时不断出现错误 完整的错误可以在这里阅读 http pastebin com UXQ34JKD http pastebin com UXQ34JKD 2014
  • javascript 的 Jquery 参数替代方案

    我需要转换以下类型字典 key1 value1 key2 value1 value2 to key1 value1 key2 即发布数据表格 我在 chrome 扩展中执行此操作 上面的表单数据字典由以下方式返回 chrome webReq
  • Facebook 无效范围错误

    我用 Rails 应用程序创建了一个 V2 3 的应用程序 4月30日前一切正常 现在我收到此错误 无效范围 offline access publish stream create event 朋友 活动 此消息仅向开发人员显示 用户 如
  • 如何判断虚拟地址在 ARM Linux 内核中是否具有有效映射?

    我想检查是否可以在不引发分段错误的情况下取消引用虚拟地址 我所说的虚拟地址不仅仅是不可信的用户空间地址 我也想检查内核虚拟地址 在 x86 Linux 内核中 可以使用 virt addr valid 函数来检查是否 虚拟地址具有有效的映射
  • std::launder 可用于将对象指针转换为其封闭数组指针吗?

    当前的标准草案 大概是 C 17 说 基本 化合物 4 http eel is c draft basic compound 4 注意 数组对象及其第一个元素不可进行指针互换 即使它们具有相同的地址 尾注 所以指向对象的指针不能reinte
  • 对 UTF-8 字符串进行排序?

    我的 std strings 以 UTF 8 编码 因此 std string 不切掉的地方是重音符号 出现在 z 后面 但它不应该出现在 z 后面 Thanks 如果您不需要字典顺序 这就是按字典顺序对 UTF 8 编码字符串进行排序的结
  • appsettings.json 文件不在 .net core 控制台项目中

    据我所知 net core 已将 app config 文件替换为 appsetting json 然而 这个文件似乎只是为 ASP net 项目添加的 事实上 它甚至在添加项目列表中不可用 我发现this https blog bitsc
  • 如何检测工作站锁

    我正在开发一个应用程序 并试图检测工作站何时被锁定 例如用户按下 Windows L 键 我知道锁定事件具有价值 WTS SESSION LOCK 0x7 但我不知道如何使用它 我在网上搜索过但一无所获 您应该使用SystemEvents
  • Rails - 带条件的 text_field 类

    我想根据条件给出一个 text field 类 有没有办法在 Rails 中做到这一点 I e 仅当发生某种情况时 我才需要 必需 该类 使用三元 condition then else 操作员 阅读起来并不
  • VS 2015:性能向导中禁用分析工具

    我想对应用程序的性能进行采样 但在尝试使用性能向导启动新的分析会话时 各种工具 例如 CPU 使用率和应用程序时间轴 不可用 我使用的是 Visual Studio 2015 专业版 该应用程序使用 ASP NET 5 RC1 并从 Kes
  • 自定义 Json(反)序列化?

    我正在将一些代码从 Net 移植到 python 有时 我们需要将任意复杂的 json 从一种格式转换为另一种格式 Eg Query Boolean Operator And Parameters Equal Name Bob Boolea
  • 打印 RDLC 报告而不显示 ReportViewer 控件

    我想知道是否可以发送 打印数据DataGridView直接到 rdlc 报告而不将其绑定到ReportViewercontrol 有许多关于将 dgv 数据绑定到报告查看器控件的线程 我不想创建另一个带有报表查看器控件的表单 而是使用带有数