2011-10-04 98 views
2

在ReportViewer中使用默认导出按钮时,是否有一种方法可以简单地提示用户打开导出的报告?我查看了ReportExport事件,尽管在导出之前会触发此事件。我唯一能想到的就是取消ReportExport并创建自己的导出功能,但我希望我不需要这样做。在导出后有没有任何事件会导致我失踪?Winforms ReportViewer和导出后打开

回答

4

我找到了解决方案。 @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."); 
} 

最后,这里是我的帮助程序方法来提示用户,如果他们选择打开文件:

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); 
    } 
} 
+0

谢谢,工作真棒。我只是为excel xlsx格式添加了这个额外的案例“case EXCELOPENXML”:return“.xlsx”; ' –

1

根据各种帖子和资源{1,2,3},您要完成的不是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); 

希望有所帮助。