2013-02-27 44 views
0

我正在使用Crystal Reports和.NET C#进行动态报告。直到运行时才能完全知道报告的内容。 报告模板只包含公式字段和到数据库表的连接。 在运行时我收集想要的数据集合,创建一个新的reportDocument对象并将集合设置为报表DataSource。然后我收集报告模板中的所有字段对象,并循环遍历它们,设置数据属性。这只要属性为字符串类型的工作得很好,但是当它被bool类型或双的,它与下面的错误崩溃:“无效的对象格式名称”Crystal Reports错误“无效的对象格式名称”。用于字段对象

如何设置的数据类型运行时将字段对象转换为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; 
       } 

      } 

回答

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 + "}"; 
        } 
       } 
相关问题