私は、 CrystalReportViewerを表示するために従来の有線接続ASP.NET MVC 2
を使用するプロジェクトで作業しています。ASP.NET WebForm
これはすべて問題なく機能します。問題は、CrystalReportViewer
インスタンスにパラメータを設定してレンダリングした後、表示されるレポートに常にパラメータ値がないことを示していることです。
他の誰かがこれに遭遇しましたか?
私は、 CrystalReportViewerを表示するために従来の有線接続ASP.NET MVC 2
を使用するプロジェクトで作業しています。ASP.NET WebForm
これはすべて問題なく機能します。問題は、CrystalReportViewer
インスタンスにパラメータを設定してレンダリングした後、表示されるレポートに常にパラメータ値がないことを示していることです。
他の誰かがこれに遭遇しましたか?
役に立つかどうかはわかりませんが、ビューでサーバー コントロールを使用して instaed ファイルを返すことをお勧めします。Crystal レポートを使用して、PDF または DOC ファイルをエクスポートし、クライアントに応答できます。このカスタム アクションの結果を使用して、レポートを結晶化することができます。
public class CrystalReportResult : FileResult
{
private const string CONTENTTYPE = "application/pdf";
private const int BUFFERSIZE = 0x1000;
private Stream FileStream { get; set; }
private DataSet DataSource { get; set; }
private string NomeArquivoRpt { get; set; }
private string Diretorio { get; set; }
public FormaAbrirPdf AbrirComo { get; set; }
public CrystalReportResult( string nomeArquivoRpt, DataSet dataSource )
: base( CONTENTTYPE )
{
DataSource = dataSource;
NomeArquivoRpt = Path.Combine( AppDomain.CurrentDomain.BaseDirectory, nomeArquivoRpt );
Diretorio = Path.Combine( AppDomain.CurrentDomain.BaseDirectory, "Temp" );
AbrirComo = FormaAbrirPdf.ComoDownload;
if ( !Directory.Exists( Diretorio ) )
{
Directory.CreateDirectory( Diretorio );
}
}
public override void ExecuteResult( ControllerContext context )
{
var response = context.HttpContext.Response;
var arquivoPdf = Path.Combine( Diretorio, String.Format( "{0}.pdf", Guid.NewGuid( ) ) );
var relatorioCrystal = new ReportClass { FileName = NomeArquivoRpt };
relatorioCrystal.Load( );
relatorioCrystal.SetDataSource( DataSource );
if ( AbrirComo == FormaAbrirPdf.ComoDownload )
{
relatorioCrystal.ExportToDisk( ExportFormatType.PortableDocFormat, arquivoPdf );
FileStream = new FileStream( arquivoPdf, FileMode.Open, FileAccess.ReadWrite );
var tamanho = (int) FileStream.Length;
var ms = new MemoryStream( tamanho );
FileStream.Read( ms.GetBuffer( ), 0, tamanho );
ms.Close( );
response.OutputStream.Write( ms.GetBuffer( ), 0, ms.GetBuffer( ).Length );
response.OutputStream.Flush( );
response.OutputStream.Close( );
response.AddHeader( "content-disposition",
String.Format( "attachment;filename={0}", arquivoPdf ) );
}
else
{
FileStream = relatorioCrystal.ExportToStream( ExportFormatType.PortableDocFormat );
response.AddHeader( "content-type", CONTENTTYPE );
}
WriteFile( response );
FileStream.Close( );
if ( AbrirComo != FormaAbrirPdf.ComoDownload ) return;
File.Delete( arquivoPdf );
}
protected override void WriteFile( HttpResponseBase response )
{
var outputStream = response.OutputStream;
using ( FileStream )
{
var buffer = new byte[BUFFERSIZE];
while ( true )
{
var bytesRead = FileStream.Read( buffer, 0, BUFFERSIZE );
if ( bytesRead == 0 )
{
break;
}
outputStream.Write( buffer, 0, bytesRead );
}
}
}
}
ダウンロードするフォーマット:
public enum FormaAbrirPdf
{
NoNavegador, // open on the browser
ComoDownload // with download
}
PS: コードは pt-br にあります