CrystalReportsと.NETC#を使用して動的レポートを作成しています。レポートの内容は、実行時まで完全にはわかりません。レポートテンプレートには、数式項目とデータベーステーブルへの接続のみが含まれます。実行時に、必要なデータコレクションを収集し、新しいreportDocumentオブジェクトを作成して、コレクションをレポートDataSourceに設定します。次に、レポートテンプレートからすべてのフィールドオブジェクトを収集し、それらをループして、データプロパティを設定します。これは、プロパティが文字列型である限り正常に機能しますが、bool型またはdouble型の場合は、「無効なオブジェクト形式名」というエラーでクラッシュします。
実行時にフィールドオブジェクトのデータ型をnumeric/boolに設定するにはどうすればよいですか?
ここにいくつかのコードがあります:
//Collecting data and setting data source
for (int i = 0; i < ColNumber; i++)
{
//Fields
var DbFieldName = mappingNames[i];
var fieldType = comparisonObj.GetFieldType(DbFieldName);
var fieldName = "Field" + (i + 1);
var ffld = report.DataDefinition.FormulaFields[fieldName];
if (ffld != null)
{
ffld.Text = "{" + aliasName + "." + DbFieldName + "}";
}
var fobj = report.ReportDefinition.ReportObjects[fieldName] as FieldObject;
if (fobj != null)
{
fobj.Left = CurrentLeft;
fobj.Width = FieldSpace * widths[i] / 100;
if (IsNumber(fieldType))
{
fobj.ObjectFormat.HorizontalAlignment = Alignment.RightAlign;
fobj.FieldFormat.NumericFormat.RoundingFormat = RoundingFormat.RoundToTen;
}
else if (IsBool(fieldType))
{
fobj.FieldFormat.BooleanFormat.OutputType = BooleanOutputType.YesOrNo;
}
}
//Headers
var ColumnHeaderName = headers[i];
var columnName = "Column" + (i + 1);
var tobj = report.ReportDefinition.ReportObjects[columnName] as TextObject;
if (tobj != null)
{
tobj.Text = ColumnHeaderName;
tobj.Left = CurrentLeft;
tobj.Width = FieldSpace * widths[i] / 100;
CurrentLeft = CurrentLeft + tobj.Width + blank;
if (IsNumber(fieldType))
tobj.ObjectFormat.HorizontalAlignment = Alignment.RightAlign;
}
}