2012-02-08 5 views
1

У меня есть объект LocalReport, который я заполняю всей необходимой информацией. Я использую этот же объект отчета для экспорта в разные форматы. Мои пользователи могут выбирать Image, Excel, Word, Pdf и т. Д., И я использую один и тот же объект отчета для облегчения запроса.VS2010 RDLC C#. Как установить объект LocalReport в ReportViewer?

Моя проблема Иногда они могут захотеть просмотреть его. Я знаю, что могу открыть экспортируемый тип, но это не то, что я хочу. Я хочу просмотреть его в ReportViewer. Я знаю, что могу установить ReportViewer.LocalReports свойства и получить то, что я ищу, но я уже настроил все в своем объекте Report.

Вопрос в следующем: Как мне сделать следующее, которое является неправильным и не может быть выполнено?

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; 

ответ

2

Вы можете попробовать, изменяя порядок вещей, которые вы сейчас делаете.

  1. Добавить ReportViewer в форму. (Я не уверен, почему вы создаете ReportViewer в коде. Я считаю, что вы не собираетесь динамически добавлять его в элементы управления формы.)

  2. Задайте всю информацию о своем отчете в объекте ReportViewer.LocalReport. Не нужно создавать его, как вы сделали это в своей первой строке кода.

  3. Метод вызова ReportViewer.RefreshReport() для рендеринга отчета в форме.

PS: Если у вас уже есть объект LocalReport, вам придется назначить свойства для этого объекта отчета в ReportViewer.

+0

Я делаю это так, потому что 95% времени пользователь не будет просматривать отчет. Таким образом, для ReportViewer не требуется. В конечном итоге я использую _Report.Render для почти всего запроса. – Jmyster

+0

Метод Render выдаст поток. Вы специально сказали, что хотите просмотреть его в ReportViewer, не так ли? :) В любом случае я рад, если это сработает так, как вы этого хотели. –

+0

Это не работает так, как я хочу. Раньше мои пользователи не рассматривали отчет, поэтому я использую объект отчета для потока большей части моего вывода через _Report.Render. Теперь мои пользователи хотят иметь возможность просматривать отчет, поэтому я должен поместить его в средство просмотра отчетов. У меня много кода, который возвращает объекты LocalReport. Я просто спрашиваю: как вы устанавливаете объект LocalReport для средства просмотра отчетов? Вы бы подумали, что это будет так же просто, как _rv.LocalReport = _Report, но это не так. Можно ли сделать это? – Jmyster

0

Вы можете обрабатывать отчет в нескольких режимах обработки. Следующий код показывает, что режим обработки является локальным.

_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); 

Надеюсь, приведенный выше образец кода поможет вам.

0

Возможно, вам удастся избежать отражения, чтобы установить LocalReport в ReportViewer, но предупреждайте, что это может вызвать проблемы. Я делаю это в проекте прямо сейчас, и, похоже, он работает хорошо. См. Мой ответ здесь: https://stackoverflow.com/a/14329386/285874

1

Как и вы, я хотел иметь возможность показывать LocalReport в ReportViewer.

Вот как я достиг этого:

Param_MyLocalReport является LocalReport, который хорошо работает [с .Render]. ReportViewer1 есть, а, ReportViewer, где я хочу показать свой отчет. Эта функция автоматическая, копирует источники данных и параметры.

 //**************************** 
     //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(); 

Как и в случае с Эль-Ниньо, это может быть перенесено в вспомогательную систему. Что-то вроде:

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

Это было лучшее решение для меня, так как мы должны генерировать «LocalReports» для вложений электронной почты и других экземпляров, где мы не создаем или не показываем «ReportViewer». Одно из предложений - установить «ReportEmbeddedResource», так как «ReportPath» имеет значение null при использовании .rdlc в качестве встроенного ресурса. 'reportViewer1.LocalReport.ReportEmbeddedResource = param_MyLocalReport.ReportEmbeddedResource' – Lithium

Смежные вопросы