Winforms ReportViewer并在导出后打开

Winforms ReportViewer并在导出后打开,winforms,visual-studio-2010,c#-4.0,report-viewer2010,Winforms,Visual Studio 2010,C# 4.0,Report Viewer2010,在ReportViewer中使用默认导出按钮时,是否有方法简单地提示用户打开导出的报告?我查看了ReportExport事件,尽管它在导出发生之前触发。我唯一能想到的是取消ReportExport并创建我自己的导出功能,尽管我希望我不需要这样做。在导出发生后,是否有任何事件我没有注意到火灾?根据各种帖子和参考资料{,,},您试图完成的不是Visual Studio中ReportViewer控件的内置功能 如果此功能是必需的,则可以始终禁用报表查看器上的“导出”按钮,并添加按钮或其他控件来处理导出

在ReportViewer中使用默认导出按钮时,是否有方法简单地提示用户打开导出的报告?我查看了ReportExport事件,尽管它在导出发生之前触发。我唯一能想到的是取消ReportExport并创建我自己的导出功能,尽管我希望我不需要这样做。在导出发生后,是否有任何事件我没有注意到火灾?

根据各种帖子和参考资料{,,},您试图完成的不是Visual Studio中ReportViewer控件的内置功能

如果此功能是必需的,则可以始终禁用报表查看器上的“导出”按钮,并添加按钮或其他控件来处理导出操作。下面是对一个方法的类调用,我在程序中使用该方法在运行报表时自动生成excel文件,但您需要做的唯一更改是通过单击按钮订阅此方法:

旁注:custNmbr是一个变量,用于以运行报告的客户的名字命名报告。如果愿意,您可以删除它(因为它是我的一个报告参数),或者通过自己的代码将其动态化,以确保文件不会相互覆盖

    public static void reportWriter(ReportViewer reportViewer1, string custNmbr)
    {
        Warning[] warnings;
        string[] streamids;
        string mimeType;
        string encoding;
        string filenameExtension;

        string Dpath = Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + custNmbr + ".xls";    

        byte[] bytes = reportViewer1.LocalReport.Render(
            "Excel", null, out mimeType, out encoding, out filenameExtension,
            out streamids, out warnings);

        using (FileStream fs = new FileStream(Dpath, FileMode.Create))
        {
            fs.Write(bytes, 0, bytes.Length);
        }
    }
由于Dpath将是这个新导出文件的位置,您只需添加对Excel互操作的引用,并通过以下方式调用Excel/新文件:

Application excel = new Application();
Workbook wb = excel.Workbooks.Open(Dpath, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value);

希望能有所帮助。

我找到了解决办法@KreepN,我在网上的各种讨论板上都看到了与您类似的解决方案,但是,我找到了另一个更适合我所寻找的解决方案。这提供了用于导出的所有默认功能。以下是我所做的:

首先,在创建表单时订阅ReportExport事件

this.reportViewer1.ReportExport += new ExportEventHandler(this.ReportViewer1_ReportExport);
以下是我的ReportExport事件处理方法:

private void ReportViewer1_ReportExport(object sender, ReportExportEventArgs e)
{
    e.Cancel = true;

    string extension = this.GetRenderingExtension(e.Extension);

    SaveFileDialog saveFileDialog = new SaveFileDialog()
    {
        Title = "Save As",
        CheckPathExists = true,
        InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments),
        Filter = e.Extension.LocalizedName + " (*" + extension + ")|*" + extension + "|All files(*.*)|*.*",
        FilterIndex = 0
    };

    if (saveFileDialog.ShowDialog(this) == DialogResult.OK)
    {
        this.reportViewer1.ExportDialog(e.Extension, e.DeviceInfo, saveFileDialog.FileName);

        // Here's where I call my method to prompt user to open the file.
        RadExportHelper.OpenFileWithPrompt(saveFileDialog.FileName);                
    }
}
RenderingExtension类不会公开导出的实际文件扩展名,因此我创建了以下方法:

private string GetRenderingExtension(RenderingExtension extension)
{
    switch (extension.Name)
    {
        case "PDF":
            return ".pdf";
        case "CSV":
            return ".csv";
        case "EXCEL":
            return ".xls";
        case "MHTML":
            return ".mhtml";
        case "IMAGE":
            return ".tif";
        case "XML":
            return ".xml";
        case "WORD":
            return ".doc";
        case "HTML4.0":
            return ".html";
        case "NULL":
            throw new NotImplementedException("Extension not implemented.");
    }

    throw new NotImplementedException("Extension not implemented.");
}
最后,这里是my helper方法,用于提示用户并在用户选择时打开文件:

public static void OpenFileWithPrompt(string file)
{
    if (RadMessageBox.Show(
        Resources.RadHelper_OpenExportedDataMessage,
        Resources.RadHelper_OpenExportedDataTitle,
        MessageBoxButtons.YesNo,
        RadMessageIcon.Question,
        MessageBoxDefaultButton.Button1) == DialogResult.Yes)
    {
        Process.Start(file);
    }
}

谢谢,干得很棒。我刚刚为ExcelXLSx格式添加了这个额外的case“EXCELOPENXML”:return.xlsx