0

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;
                }

            }
4

1 に答える 1

0

まあ、誰も解決策を手伝ってくれなかったので、私は自分で解決策を見つけました。toStringメソッドを使用してブール値と数値を文字列に変換しました。(私の目には)最善の解決策ではありません。フィールドオブジェクトのタイプを自分で変更したかったのですが、機能します。

                var DbFieldName = mappingNames[i];
                var fieldType = comparisonObj.GetFieldType(DbFieldName);

                var fieldName = "Field" + (i + 1);
                var ffld = report.DataDefinition.FormulaFields[fieldName];
                if (ffld != null)
                {
                    if (IsNumber(fieldType))
                        ffld.Text = "ToText({" + aliasName + "." + DbFieldName + "}, 00, '')";
                    else if (IsDateTime(fieldType))
                        ffld.Text = "ToText({" + aliasName + "." + DbFieldName + "}, \"dd/MM/yyyy\")";
                    else if (IsBool(fieldType))
                        ffld.Text = "if{" + aliasName + "." + DbFieldName + "} then \"Y\" else \"N\"";
                    else
                    {
                        ffld.Text = "{" + aliasName + "." + DbFieldName + "}";
                    }
                }
于 2013-03-01T12:37:20.220 に答える