如何将DataGridView导出到ReportViewer?

时间:2011-06-13 19:42:10

标签: datagridview reportviewer

我正在开发一个C#项目,我在其中从数据库生成报告,然后在DataGridView中显示,因为动态添加行和列更简单。但是我现在需要动态地将DataGridView内容导出到ReportViewer中以进行打印。我不想显示ReportViewer。我只是想创建它的实例并从我的DatagridView填充,然后立即显示Print Dialog,以便在输出中获得高质量和组织良好的布局。目前我通过将报表转换为HTML来打印报表,然后将报表分配给WebBrowser控件并调用ShowPrintDialog()方法。但是这样我就无法控制一些打印问题,例如在WebBrowser按顺序输出表格的情况下在所有页面中打印列标题。

我需要在最短的时间内达到这个目标,因为这是一个生产项目。

任何想法都是值得欣赏的。

1 个答案:

答案 0 :(得分:0)

您应该使用 Microsoft Report Viewer http://www.microsoft.com/en-us/download/details.aspx?id=3841 在您的项目中添加dll:Microsoft.ReportViewer.Common和Microsoft.ReportViewer.WinForms,因此您必须使用此文件创建* .rdlc文件,您可以更改报告的设计。最后为了保存它你可以做一些事情:

public static void PrintArticles(ICollectionView Articles)
        {

            try
            {
                var articlesRows = new DataTable("Articles");
                articlesRows.Columns.Add("Id");
                articlesRows.Columns.Add("Description");

                var arts = Articles.Cast<Article>();

                foreach (var art in arts)
                {
                    articlesRows.Rows.Add(art.Id, art.Description);
                }

                ReportViewer reporter = new ReportViewer();
                reporter.LocalReport.DisplayName = "Report1";
                reporter.LocalReport.ReportPath = Path.Combine(Program.BasePath + "PrintArticles.rdlc");
                reporter.LocalReport.DataSources.Clear();
                reporter.LocalReport.DataSources.Add(new ReportDataSource("Project1", articlesRows));

                byte[] report = reporter.LocalReport.Render("PDF");

                reporter.LocalReport.ReleaseSandboxAppDomain();

                string pdfpath = Path.Combine(Program.BasePath, "file.pdf");

                if (File.Exists(pdfpath))
                    File.Delete(Path.Combine(Program.BasePath, "file.pdf"));

                FileStream writer = new FileStream(pdfpath, FileMode.Create);
                writer.Write(report, 0, report.Length);
                writer.Close();

                Process ar = Process.Start(pdfpath);
            }
            catch (Exception e)
            {

            }
            }