您的位置:首页 > 编程语言 > C#

在c#中动态生成水晶报表时,动态添加sort

2011-03-30 16:37 393 查看
private void SetSortQuick(ReportClientDocument objRPT)
{
if (!String.IsNullOrEmpty(this.SortField))
{
cCreateReport objCreateReport = new cCreateReport();
string[] arrySortField = this.SortField.Split(new char[] { ',' });
string[] arrySortDirection = this.SortDirection.Split(new char[] { ',' });
for (int i = 0; i < arrySortField.Length; i++)
{
string[] arryTemp = arrySortField[i].Split(new char[] { '|' });
string strFieldName = arryTemp[0];
string strFieldType = arryTemp[1].ToLower();

string strFormula = "", strFormulaName = "";
switch(strFieldType)
{
case "datetime":
strFormula = "date({" + arrySortField[i] + "})";
break;
case "numeric":
case "int":
case "money":
case "float":
strFormula = "ToNumber({" + arrySortField[i] + "})";
break;
default:
strFormula = "{" + arrySortField[i] + "}";
break;
}
strFormulaName = "Order" + i.ToString();

objRPT.DataDefController.FormulaFieldController.AddByName(strFormulaName, strFormula, CrFormulaSyntaxEnum.crFormulaSyntaxCrystal);
ISCRField objS = objRPT.DataDefController.FindFieldByFormulaForm("{@"+strFormulaName+"}");

if (objRPT.DataDefController.SortController.CanSortOn(objS))
{
SortClass objSort = new SortClass();
objSort.SortField = objS;
int countOfSort = objRPT.DataDefinition.Sorts.Count;
if (arrySortDirection[i] == "1")
{
objSort.Direction = CrSortDirectionEnum.crSortDirectionDescendingOrder;
}
else
{
objSort.Direction = CrSortDirectionEnum.crSortDirectionAscendingOrder;
}
objRPT.DataDefController.SortController.Add(countOfSort, objSort);
}
}
}
}

必须使用这种方式才可以动态添加公式为排序字段

objRPT.DataDefController.FormulaFieldController.AddByName(strFormulaName, strFormula, CrFormulaSyntaxEnum.crFormulaSyntaxCrystal);
ISCRField objS = objRPT.DataDefController.FindFieldByFormulaForm("{@"+strFormulaName+"}");

我试图使用如下方式动态添加公式字段,但是用CanSortOn检测总是不能作为sort字段。


代码

public void AddFormula(ReportClientDocument oReportClientDocument,
string szName,
string szFormula,
CrFieldValueTypeEnum crFieldValueType
)
{
FormulaField oFormulaField;

oFormulaField = new FormulaField();

oFormulaField.Name = szName;
oFormulaField.Text = szFormula;
oFormulaField.Syntax = CrFormulaSyntaxEnum.crFormulaSyntaxCrystal;
oFormulaField.Type = crFieldValueType;

oReportClientDocument.DataDefController.FormulaFieldController.Add(oFormulaField);
}

代码

public FormulaField FindFormulaField(ReportClientDocument oReportClientDocument, string szFormula)
{
FormulaField oFormulaField;
Fields oFields;
int iIndex;
oFormulaField = new FormulaFieldClass();

oFields = oReportClientDocument.DataDefinition.FormulaFields;
iIndex = oFields.Find(szFormula, CrFieldDisplayNameTypeEnum.crFieldDisplayNameName, CeLocale.ceLocaleUserDefault);
oFormulaField = ((FormulaField)oFields[iIndex]);

return oFormulaField;
}

后来我发现找到的公式字段的IsRecurring属性是false.只有这个属性为true时才可以作为sort的字段。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: