水晶报表文本对象和字段



我正在运行以下代码

foreach (ReportObject obj in oSectionObjects)
{
    if (obj.Kind == CrystalDecisions.Shared.ReportObjectKind.TextObject)
    {
        // do stuff
    }
}

但我有一个问题。 我确实有多个文本,其中确实包含文本 AND 字段。但是水晶返回我正在TextObject的领域,这在技术上是正确的。

怎么知道我TextObject中只有文本,而没有其他任何东西(又名字段、参数、公式)?

据我所知,文本框中的字段将被文本模式识别。尝试在文本对象的文本中搜索 {1@xxxxx,其中 xxxxx 是字段名称。"{1@"显示字段的类型:1 表示数据库,2 表示公式,3 表示参数。您也可以尝试 {@xxxxx} *(不带数字字段标识符)

我四处搜索了很多,找到了 RAS 报告的工作解决方案,但没有水晶。无论如何,如果有人最终在这里寻找答案,这就是解决方法。

每当您必须连接报表上的多个字段时,不要使用 TextObject .而是使用Formula。公式字段不会下注部分ReportObjects,而是CrystalDecisions.Shared.FieldKind.FormulaField Kind ReportDocument.DataDefinition.FormulaFields的一部分,您将需要检查ValueType,以便它CrystalDecisions.Shared.FieldValueType.StringField

然后你可以操纵它们。

我确实需要它来翻译实时报告,所以这里有一个公式的解析方法:

try
{
    var sFormula = formula.Text;
    string pattern = ""[\w ]*"";
    Regex r = new Regex(pattern);
    MatchCollection mc = r.Matches(sFormula);
    foreach (Match m in mc)
    {
        var sValue =m.Value;
        var sParsedValue = sValue.Substring(1, sValue.Length - 2);
        if (sParsedValue.StartsWith("s"))
        {
            var stest = """ + CApplicationData.TranslateStringValue(sParsedValue) + """;
            sFormula = sFormula.Replace(sValue, stest);
        }
    }
    formula.Text = sFormula;
}
catch{}

上面你会注意到我使用's'作为键,知道它可能是一个要翻译的值,所以它不是强制性的。 在西班牙语中使用此公式的上述内容:

"sPage" + " " + totext(PageNumber) + " " + "sOf" + " " + totext(TotalPageCount)

将公式修改为:

"Página" + " " + totext(PageNumber) + " " + "de" + " " + totext(TotalPageCount)

给出的输出:

Página 1 de 4

最新更新