I had worked with a few customers in the past who had the following requirement.
Using web ReportViewer control. Rendering a Server Report Providing an option to create a Copy of the existing report with some specified set of Parameters First of all, we need to capture the selected parameters in a ReportParameterInfoCollection object. Here it is: protected void ReportViewer1_Load(object sender, EventArgs e) { pm = ((Microsoft.Reporting.WebForms.ReportViewer)(sender)).ServerReport.GetParameters(); } Since, as per the requirement we need to make a copy of the Report, there are number of approaches to do this. Please refer: http://msdn.microsoft.com/en-us/library/aa237807(SQL.80).aspx
First of all, we need to capture the selected parameters in a ReportParameterInfoCollection object. Here it is:
protected void ReportViewer1_Load(object sender, EventArgs e) { pm = ((Microsoft.Reporting.WebForms.ReportViewer)(sender)).ServerReport.GetParameters(); }
Since, as per the requirement we need to make a copy of the Report, there are number of approaches to do this. Please refer: http://msdn.microsoft.com/en-us/library/aa237807(SQL.80).aspx
But the main intent here is to copy the report with a desired name. For this, we use a Textbox to allow the user to enter the desired name. In the Save button click we need to do the following: Call the method, ReportingService2005.GetReportDefinition, and save the report with the above specified parameters. This report can be treated like a temporary file. Upload the Report with the name we desired for, for this we use the method: ReportingService2005.CreateReport Method
But the main intent here is to copy the report with a desired name. For this, we use a Textbox to allow the user to enter the desired name.
In the Save button click we need to do the following:
protected void Save_Click(object sender, EventArgs e) { rs = new ReportingService2005(); rs.Credentials = System.Net.CredentialCache.DefaultCredentials; string reportName = ReportViewer1.ServerReport.ReportPath; byte[] reportDefinition = null; System.Xml.XmlDocument doc = new System.Xml.XmlDocument(); try { //Following code helps us Save a report as an RDL file reportDefinition = rs.GetReportDefinition(reportName); MemoryStream stream = new MemoryStream(reportDefinition); doc.Load(stream); doc.Save("C:\" + TextBox1.Text + "rdl"); //Following code helps us upload the RDL file with the desired name. Byte[] definition = null; Warning[] warnings = null; FileStream stream1 = File.OpenRead("C:\" + TextBox1.Text + "rdl"); definition= new Byte[stream1.Length]; stream1.Read(definition, 0, (int)stream1.Length); stream1.Close(); warnings = rs.CreateReport(TextBox1.Text, "/Path", true, definition, null); if (warnings != null) { foreach (Warning warning in warnings) { Console.WriteLine(warning.Message); } } SetReportParameters(); } catch (SoapException ex) { //Enter exception details } }
Now, we need to set the parameters of the uploaded report to the one we had captured from the ReportViewer control. private void SetReportParameters() { rs = new ReportingService2005(); rs.Credentials = System.Net.CredentialCache.DefaultCredentials; List<string> str = null; ReportParameter[] parameters = rs.GetReportParameters(@"/CascadingParamRepro/" + TextBox1.Text, null, false, null, null); if (parameters != null) { foreach (ReportParameter parameter in parameters) { foreach (Microsoft.Reporting.WebForms.ReportParameterInfo d in pm) { str = new List<string>(); for (int i = 0; i < d.Values.Count; i++) { str.Add(d.Values[i].ToString()); } if (d.Name == parameter.Name) { parameter.DefaultValues = str.ToArray(); } } } rs.SetReportParameters("/ReportPath/" + TextBox1.Text, parameters); } } The above code snippet helps us Set the parameters to the desired values. Hope this helps!!
Now, we need to set the parameters of the uploaded report to the one we had captured from the ReportViewer control.
private void SetReportParameters() { rs = new ReportingService2005(); rs.Credentials = System.Net.CredentialCache.DefaultCredentials; List<string> str = null; ReportParameter[] parameters = rs.GetReportParameters(@"/CascadingParamRepro/" + TextBox1.Text, null, false, null, null); if (parameters != null) { foreach (ReportParameter parameter in parameters) { foreach (Microsoft.Reporting.WebForms.ReportParameterInfo d in pm) { str = new List<string>(); for (int i = 0; i < d.Values.Count; i++) { str.Add(d.Values[i].ToString()); } if (d.Name == parameter.Name) { parameter.DefaultValues = str.ToArray(); } } } rs.SetReportParameters("/ReportPath/" + TextBox1.Text, parameters); } }
The above code snippet helps us Set the parameters to the desired values.
Hope this helps!!