0

私は、 CrystalReportViewerを表示するために従来の有線接続ASP.NET MVC 2を使用するプロジェクトで作業しています。ASP.NET WebForm

これはすべて問題なく機能します。問題は、CrystalReportViewerインスタンスにパラメータを設定してレンダリングした後、表示されるレポートに常にパラメータ値がないことを示していることです。

他の誰かがこれに遭遇しましたか?

4

1 に答える 1

0

役に立つかどうかはわかりませんが、ビューでサーバー コントロールを使用して 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 にあります

于 2012-07-03T14:01:27.423 に答える