2008-11-19 20 views
6

Tôi đang cố gắng in tệp RDLC trực tiếp mà không hiển thị Trình xem Báo cáo Microsoft, tôi đã theo dõi MSDN's example nhưng bây giờ, mỗi lần tôi gọi phương thức "Render" Ví dụ của tôi lớp LocalReport nó ném "Một hoặc nhiều tham số cần thiết để chạy báo cáo chưa được chỉ định." ngoại lệ.Một hoặc nhiều tham số cần thiết để chạy báo cáo chưa được chỉ định

Bất kỳ ai có thể cho tôi biết tham số nào là bắt buộc mà tôi đã bỏ lỡ? hoặc làm cách nào tôi có thể tìm thêm chi tiết về ngoại lệ này?

 LocalReport report = new LocalReport(); 
     report.ReportPath = System.Windows.Forms.Application.StartupPath + "\\" + rdlcFileName; 
     report.EnableExternalImages = true; 

     ReportParameter[] reportParams = new ReportParameter[] 
     { 
      new ReportParameter("LogoAddress", settings.LogoFileName), 
      new ReportParameter("FooterValue", settings.InvoicesFooter) 
     }; 
     report.SetParameters(reportParams); 

     report.DataSources.Add(new ReportDataSource("Invoice", new PrintableInvoice[] { invoice })); 
     report.DataSources.Add(new ReportDataSource("InvoiceItem", invoiceItems)); 

     Warning[] warnings; 
     try 
     { 
      string deviceInfo = 
       "<DeviceInfo>" + 
       " <OutputFormat>EMF</OutputFormat>" + 
       " <PageWidth>8.5in</PageWidth>" + 
       " <PageHeight>11in</PageHeight>" + 
       " <MarginTop>0.25in</MarginTop>" + 
       " <MarginLeft>0.25in</MarginLeft>" + 
       " <MarginRight>0.25in</MarginRight>" + 
       " <MarginBottom>0.25in</MarginBottom>" + 
       "</DeviceInfo>"; 

      m_streams = new List<Stream>(); 
      report.Render("Image", deviceInfo, _CreateStream, out warnings); 

      foreach(Stream stream in m_streams) 
       stream.Position = 0; 
     } 
     catch(Exception ex) 
     { 
      System.Diagnostics.Debug.WriteLine(ex.Message); 
     } 

và _CreateStream là:

private Stream _CreateStream(string name, string fileNameExtension, Encoding encoding, string mimeType, bool willSeek) 
    { 
     Stream stream = new FileStream(name + "." + fileNameExtension, FileMode.Create); 
     m_streams.Add(stream); 
     return stream; 
    } 
+1

câu trả lời được tìm thấy tại: http://social.msdn.microsoft.com/Forums/zh/vsreportcontrols/thread/7cce3c91-f876-417a-81cc-10e10dde0e40 – MilkyWayJoe

Trả lời

15

tôi chỉ phát hiện ra nếu bạn vượt qua giá trị tham số như chuỗi rỗng như tham số = "" nó sẽ cho bạn biết rằng lỗi

Tôi mất một lúc

+1

Cảm ơn! Điều đó có thể đã đưa tôi lứa tuổi để tìm ra có lẽ. :) (chỉ có lỗi chính xác tương tự) –

+0

Giải pháp thay thế nếu tôi thực sự muốn truyền chuỗi rỗng là gì? – JoshNaro

5

Cho phép các thuộc tính null trong tham số sẽ giải quyết vấn đề này.

3

Nguyên nhân: Báo cáo cục bộ không cho phép bạn chuyển các thông số trống hoặc không, tôi không biết tại sao nhưng nó lại ném ngoại lệ.

Fix: Một cách để tìm ra các thông số gây ra ngoại lệ là gọi var result = report.LocalReport.GetParameters(); phương pháp, trong mảng kết quả của các thông số nó có result[0].State tài sản, nếu đó là giá trị MissingValidValue nó gây ra những ngoại lệ.

Ví dụ:

var rv = new ReportViewer { ProcessingMode = ProcessingMode.Local }; 
     rv.LocalReport.ReportPath = Server.MapPath("~/PrintForms/FromForm.rdlc"); 
     rv.LocalReport.Refresh(); 

     string mimeType; 
     string encoding; 
     string filenameExtension; 
     string[] streamids; 
     Warning[] warnings; 

     rv.LocalReport.SetParameters(new ReportParameter("ClientName", "გიორგი გიორგაძე")); 
     rv.LocalReport.SetParameters(new ReportParameter("Account", "888"));var streamBytes = rv.LocalReport.Render("PDF", null, out mimeType, out encoding, out filenameExtension, out streamids, out warnings); 
     return File(streamBytes, mimeType); 

Mã trên hoạt động tốt, nhưng nếu bạn thay đổi tham số thêm dòng:

rv.LocalReport.SetParameters(new ReportParameter("Account", null)); 

giá trị Nhà nước Tài khoản ReportParameter của sẽ MissingValidValue và nó sẽ gây ra ngoại lệ.

+2

Đây phải là câu trả lời được chấp nhận. – BG100

1

Nếu bạn thực sự cần phải vượt qua một chuỗi trống như giá trị, bạn có thể làm folowing:

  • mở Parameter Properties (nhấn chuột phải tham số của bạn trên bảng báo cáo dữ liệu);
  • đánh dấu hộp kiểm Cho phép giá trị trống ("").

Điều này giải quyết mọi thứ cho tôi.

+0

Đây phải là câu trả lời được chấp nhận, nó thực sự cung cấp một giải pháp. – dyrssen

0

Một cách khác có thể xảy ra là nếu bạn đang sử dụng Tập dữ liệu được chia sẻ và bạn bao gồm DataSets mà báo cáo của bạn không sử dụng. Mỗi báo cáo phải xác định phiên bản riêng của các tham số cho mỗi Tập dữ liệu được chia sẻ cục bộ. Vì vậy, nếu bạn đã bao gồm Tập dữ liệu làm một trong các nguồn dữ liệu của mình và bạn chưa xác định rõ cách báo cáo cụ thể này chuyển các tham số đến Tập dữ liệu đó, bạn sẽ gặp phải lỗi này.

Các vấn đề liên quan