Расскажите, пожалуйста, как правильно передавать данные в отчёт, который загружается из сборки. В своем приложении я передаю в отчёт массив объектов. Если я создаю экземпляр StiReport, то всё работает правильно, данные в отчёт попадают и отображаются. Но если загружать отчёт из сборки ( StiReport.GetReportFromAssembly(...)), то в отчёт попадают только переменные. Не могу понять в чём причина такого странного поведения.
Ниже приведён код основного класса-обёртки на stimulReport.
Код: Выделить всё
public class StimulReportDesigner
{
private StiReport _stiReport;
public StimulReportDesigner()
{
SetEngineOptions();
SetDesignerOptions();
SetDictionaryOptions();
}
public void PreviewReport()
{
using (_stiReport)
{
CompileReport();
_stiReport.Show(true);
}
}
private void CompileReport()
{
var reportFileName = _stiReport.ReportFile;
var compiledReportFileName = string.Format("{0}.dll", reportFileName);
if (!File.Exists(compiledReportFileName) || CompiledReportIsOlderThanReport(reportFileName, compiledReportFileName))
{
_stiReport.Compile(compiledReportFileName);
}
}
public void OpenReport(string reportFileName, bool isLocalTemplate)
{
if (!File.Exists(reportFileName))
{
throw new Exception(string.Format("Не найден файл шаблона {0}!", reportFileName));
}
var compiledReportFileName = string.Format("{0}.dll", reportFileName);
if (!File.Exists(compiledReportFileName) || CompiledReportIsOlderThanReport(reportFileName, compiledReportFileName))
{
_stiReport = new StiReport();
_stiReport.Load(reportFileName);
}
else
{
_stiReport = StiReport.GetReportFromAssembly(compiledReportFileName, false);
}
}
private bool CompiledReportIsOlderThanReport(string reportFileName, string compiledReportFileName)
{
var reportFileInfo = new FileInfo(reportFileName);
var compiledReportFileInfo = new FileInfo(compiledReportFileName);
return compiledReportFileInfo.CreationTime < reportFileInfo.CreationTime
|| compiledReportFileInfo.CreationTime < reportFileInfo.LastWriteTime;
}
public void UpdateReportDictionary(ReportData reportData)
{
if (_stiReport == null)
{
_stiReport = new StiReport();
}
_stiReport.Dictionary.Databases.Clear();
_stiReport.Dictionary.DataStore.Clear();
_stiReport.Dictionary.DataSources.Clear();
RegisterData(reportData);
_stiReport.Dictionary.Synchronize();
}
private void RegisterData(ReportData reportData)
{
if (reportData != null && reportData.Tables.Any())
{
foreach (var table in reportData.Tables)
{
if (!table.IsEmpty || Settings.ShowEmptyTables)
{
_stiReport.RegData(table.Name, GetArrayFromList(table));
}
}
}
if (reportData != null)
{
foreach (ReportVariable variable in reportData.Variables)
{
if (!variable.IsEmpty || Settings.ShowEmptyVariables)
{
var newVariable = new StiVariable
{
Alias = variable.Caption,
Name = variable.Name,
ValueObject = variable.Value ?? string.Empty,
Type = variable.Value != null?variable.Value.GetType():typeof(string)
};
if (!_stiReport.Dictionary.Variables.Contains(newVariable.Name))
{
_stiReport.Dictionary.Variables.Add(newVariable);
}
else
{
_stiReport.Dictionary.Variables[newVariable.Name].ValueObject = newVariable.ValueObject;
}
_stiReport[newVariable.Name] = newVariable.ValueObject;
}
}
}
}
private static object[] GetArrayFromList(ReportTable table)
{
var sourceRows = table.GetRows();
var rows = new object[sourceRows.Count];
for (int i = 0; i < sourceRows.Count; i++)
{
rows[i] = sourceRows[i];
}
return rows;
}
public class Settings
{
public static bool ShowEmptyTables = true;
public static bool ShowEmptyVariables = true;
}
private static void SetDictionaryOptions()
{
StiOptions.Dictionary.AutoSynchronize = StiAutoSynchronizeMode.Always;
StiOptions.Dictionary.ShowOnlyAliasForDataSource = true;
StiOptions.Dictionary.ShowOnlyAliasForDataRelation = true;
StiOptions.Dictionary.ShowOnlyAliasForDatabase = true;
StiOptions.Dictionary.ShowOnlyAliasForData = true;
StiOptions.Dictionary.ShowOnlyAliasForDataColumn = true;
StiOptions.Dictionary.ShowOnlyAliasForPages = true;
StiOptions.Dictionary.ShowOnlyAliasForComponents = true;
StiOptions.Dictionary.ShowOnlyAliasForVariable = true;
StiOptions.Dictionary.BusinessObjects.MaxLevel = 3;
StiOptions.Dictionary.BusinessObjects.AllowUseDataColumn = true;
StiOptions.Dictionary.BusinessObjects.AllowUseFields = true;
StiOptions.Dictionary.BusinessObjects.AllowUseProperties = true;
}
private static void SetDesignerOptions()
{
StiOptions.Windows.GlobalGuiStyle = StiGlobalGuiStyle.Windows7;
StiOptions.Designer.ShowSelectTypeOfGuiOption = false;
StiOptions.Designer.AutoCorrectComponentName = true;
StiOptions.Designer.AutoCorrectDataColumnName = true;
StiOptions.Designer.AutoCorrectDataRelationName = true;
StiOptions.Designer.AutoCorrectDataSourceName = true;
StiOptions.Designer.AutoCorrectReportName = true;
}
private static void SetEngineOptions()
{
StiOptions.Engine.HideRenderingProgress = true;
StiOptions.Engine.HideExceptions = false;
StiOptions.Engine.HideMessages = false;
}
}