¿Por qué mis informes arrojan una excepción al configurar los parámetros del informe?

Bien, mi escenario es que tengo un solo visor de informes en un formulario, que conecta varios informes en función de una elección. Tengo todos mis informes configurados como recursos integrados para la acción de compilación.

Estoy cargando los informes de esta manera antes de establecer mis parámetros.

myReportViewer.LocalReport.ReportEmbeddedResource = "MyApp.MyReport1.rdlc";

OR

myReportViewer.LocalReport.ReportEmbeddedResource = "MyApp.MyReport2.rdlc";

Esta situación es muy extraña. Digamos que ejecuto la aplicación y elijo MyReport1 primero y lo ejecuto. Este informe es el que contiene los parámetros. MyReport2 no tiene ningún parámetro, solo fuentes de datos. MyReport1 se cargará correctamente y todo funcionará perfectamente. Luego puedo cambiar a MyReport2 y alternar entre ambos informes tantas veces como quiera.

Digamos que ejecuto MyReport2 primero. Se carga correctamente y puedo ejecutarlo varias veces. Sin embargo, si vuelvo a MyReport1, arroja la siguiente excepción cuando intento configurar los parámetros.

An attempt was made to set a report parameter 'TotalTime' that is not defined in this report.

En cuanto a esta excepción, supondría que MyReport1 no se cargó por algún motivo. Cuando configuro LocalReport.ReportEmbeddedResource. ¿Qué causaría que MyReport1 no se cargara correctamente solo porque no lo había usado primero?

Aquí está el código, por supuesto he recortado partes que no puedo mostrar.

if (ReportComboBox.SelectedItem.ToString() == "Time by user") {
     myReportViewer.LocalReport.DataSources.Clear();
     ReportDataSource datasource = new ReportDataSource();
     datasource.Name = "DataSet1";
     datasource.Value = DataSet1BindingSource;
     myReportViewer.LocalReport.DataSources.Add(datasource);
     try {
          myReportViewer.LocalReport.ReportEmbeddedResource = "";
          myReportViewer.LocalReport.ReportEmbeddedResource = "MyApp.MyReport1.rdlc";
          ReportParameter test = new ReportParameter("TotalTime", total.ToString("c"));
          myReportViewer.LocalReport.SetParameters(test);
          myReportViewer.RefreshReport();
     } catch (Exception ex) { 

     }
} else if (ReportComboBox.SelectedItem.ToString() == "Time - Everyone") {
     myReportViewer.LocalReport.DataSources.Clear();
     ReportDataSource datasource = new ReportDataSource();
     datasource.Name = "CompetitionUsers";
     datasource.Value = MyData;
     myReportViewer.LocalReport.DataSources.Add(datasource);
     myReportViewer.LocalReport.ReportEmbeddedResource = "";
     myReportViewer.LocalReport.ReportEmbeddedResource = "MyApp.MyReport2.rdlc";
     myReportViewer.RefreshReport();
}

Tiempo por usuario, es el apartado que está flipando. Al mirar el código, no hay nada realmente útil allí. Funciona siempre que lo ejecute primero.

preguntado el 22 de mayo de 12 a las 16:05

2 Respuestas

Lo que tienes que hacer es llamar myReportViewer.Reset() antes de cargar un nuevo informe. Al hacerlo, se restablecerá el control ReportViewer a su estado predeterminado y el objeto LocalReport se reemplazará con una nueva instancia. Esto debería solucionar tu problema.

(En realidad, me topé con una publicación muy similar que tenía la misma solución :: Excepción de LocalReport.SetParameters Se intentó establecer un parámetro de informe 'ParameterName' que no está definido en este informe)

contestado el 23 de mayo de 17 a las 13:05

¡Eso fue todo! No puedo creer que no lo haya probado... bueno, disfruta de tus +50 puntos :) - conejito malo

¿Ha intentado establecer ReportViewer.LocalReport en nulo y volver a crearlo cada vez que se detecta un cambio del usuario?

Edit:

Intente configurar los parámetros de su informe en este orden si el usuario selecciona la primera opción de informe:

 ReportParameter[] param = new ReportParameter[1];
 param[0] = new ReportParameter("Report_Parameter_0",txtParameter.Text);
        ReportViewer1.LocalReport.SetParameters(param);

        ReportDataSource rds = new ReportDataSource
            ("DataSet1_Customers_DataTable1", customerList);
        ReportViewer1.LocalReport.DataSources.Clear();
        ReportViewer1.LocalReport.DataSources.Add(rds);
        ReportViewer1.LocalReport.Refresh();

Respondido el 07 de junio de 12 a las 20:06

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.