2013-02-27 83 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 + "}"; 
        } 
       }