【问题标题】:Crystal Reports error "Invalid object format name." for field objectsCrystal Reports 错误“无效的对象格式名称”。对于字段对象
【发布时间】:2013-02-13 02:12:32
【问题描述】:

我正在使用 Crystal Reports 和 .NET C# 制作动态报表。报告的内容直到运行时才完全知道。 报告模板仅包含公式字段和与数据库表的连接。 在运行时,我收集所需的数据集合,创建一个新的 reportDocument 对象并将集合设置为报表数据源。然后我从报告模板中收集所有字段对象并循环访问它们,设置数据属性。只要属性是字符串类型就可以正常工作,但是当它是 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;
                }

            }

【问题讨论】:

    标签: c# asp.net crystal-reports


    【解决方案1】:

    嗯, 由于没有人可以帮助我解决问题,我自己想出了一个解决方案。我使用 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 + "}";
                        }
                    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-03
      相关资源
      最近更新 更多