2011-10-04 1 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

감사합니다. 매우 효과적이었습니다. 방금 엑셀 xlsx 형식의 경우 "EXCELOPENXML"case를 추가했습니다 : return "xlsx"; ' –

1

다양한 게시물 및 리소스 {1, 2, 3}에 따르면 달성하려는 것은 Visual Studio의 ReportViewer 컨트롤의 기본 제공 기능이 아닙니다.

이 기능이 필수 인 경우 보고서 뷰어에서 내보내기 단추를 비활성화하고 단추 나 다른 컨트롤을 추가하여 내보내기를 처리 할 수 ​​있습니다. 아래는 보고서를 실행할 때 엑셀 파일을 자동 생성하기 위해 프로그램에서 사용하는 메서드에 대한 클래스 호출이지만 단추를 클릭하면이 메서드를 구독하면됩니다.

사이드 노트 : 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이 새로 내 보낸 파일의 위치가 될 것입니다 때문에, 당신은 단순히 엑셀 상호 운용성에 대한 참조를 추가하고 엑셀 /를 통해 새 파일을 호출 할 수 있습니다

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

희망을.