VS2010 RDLC C#. How can I set a LocalReport object to a ReportViewer?

无人久伴 提交于 2020-01-23 21:37:29

问题


I have a LocalReport object that I fill with all the apropriate information. I use this same report object to export to different formats. My users can select Image, Excel, Word, Pdf, etc. and I use the same report object to facilitate those request.

My issue is sometimes they may want to view it. I know I can open the exported type but that is not what I want to happen. I want to view it in a ReportViewer. I know I can set ReportViewer.LocalReports properties and get what I'm looking for , but I already set everything up in my Report object.

So the question is: How do I do the followin which is incorrect and can't be done?

LocalReport _Report = new LocalReport();

//set all my report information

Microsoft.Reporting.WinForms.ReportViewer _rv = new Microsoft.Reporting.WinForms.ReportViewer();

//This is what I'm trying to do
 _rv.LocalReport = _Report;

回答1:


You can try by altering the order of things you are currently doing.

  1. Add a ReportViewer to the form. (I am not sure why you are creating the ReportViewer in code. I believe you are not going to dynamically add it to the controls of the form.)

  2. Set all your report information in the ReportViewer.LocalReport object. No need to create it like you have done it in your first line of code.

  3. Call ReportViewer.RefreshReport() method to render the report on the form.

PS: If you already have a LocalReport object, you will have to assign the properties from that to the report object on the ReportViewer.




回答2:


Like you, I wanted to be able to show a LocalReport in a ReportViewer.

Here how I've achieved this :

Param_MyLocalReport is the LocalReport that is working well [with .Render]. ReportViewer1 is, eh, the ReportViewer where I want to show my report. This function is automatic, an will copy data-sources and parameters.

        //****************************
        //assign report Path
        reportViewer1.LocalReport.ReportPath = param_MyLocalReport.ReportPath;
        //****************************

        //****************************
        //assign data-sources
        foreach (ReportDataSource MyDS in param_MyLocalReport.DataSources)
            reportViewer1.LocalReport.DataSources.Add(MyDS);
        //****************************

        //****************************
        //Assign parameters 

        //get a list of actual parameters in the report, with the actual assigned value
        ReportParameterInfoCollection MyOrigParams = param_MyLocalReport.GetParameters(); //I didn't find simpler way to fetch params...

        //create a List of parameter [to feed the reportViewer]
        List<ReportParameter> MyListOfPArams = new List<ReportParameter>();

        //for each params found through GetParameters(), add it to the List<> of params
        for (int i = 0; i < MyOrigParams.Count; i++)
            MyListOfPArams.Add(new ReportParameter(MyOrigParams[i].Name, MyOrigParams[i].Values[0]));

        //final assignation of the parameters
        reportViewer1.LocalReport.SetParameters(MyListOfPArams);
        //****************************


        //show the report
        reportViewer1.RefreshReport();

Like El Nino mentionned, this can be pushed in an helper fonction. Something like :

 Private void Convert_LocalReport_To_ReportViewer(LocalReport Param_MyLocalReport, ReportViewer param_MyReportViewer)
{ 
...copy the same code here...
}



回答3:


You can process the report in more than one processing mode. The following code shows you the processing mode is Local.

_RptViewer.ProcessingMode=ProcessingMode.Local;  
// _RptViewer is the name of the Report Viewer Control added to your Page/Form.

LocalReport objRpt=_RptViewer.LocalReport;
objRpt.ReportPath=Server.MapPath("YourReportName.rdlc");

ReportDataSource rds=new ReportDataSource("DataSourceName",DataSourceObject);     
//"DataSourceName" can be the name of the DataSet you created during designing the Report; 
//and DataSourceObject can be a method that returns a data table or DataTable that is defined in your code above, or any valid object that provides data to the report.*

objRpt.DataSources.Clear();
objRpt.DataSources.Add(rds);

I hope the above code sample helps you out.




回答4:


You might be able to get away with using reflection to set the LocalReport on a ReportViewer but be warned that this could cause issues. I'm doing this on a project right now and it seems to work well. See my answer here: https://stackoverflow.com/a/14329386/285874



来源:https://stackoverflow.com/questions/9200308/vs2010-rdlc-c-how-can-i-set-a-localreport-object-to-a-reportviewer

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!