Spalten die auf Formeln bassieren auf CalculatedColumnBase, dieses Steuerelement hat einen Standard-Renderer CalculatedColumnBaseDefaultRenderer. Damit können eigene Spalten auf Basis einer Formel implementiert werden.

Neben dem Setzen vom ColumnType, muss auch die Methode GetDataType überschrieben werden. Diese definiert den Datentyp welcher durch die Formel zurückgegeben wird.

Die Formel selbst wird in GetCriteria implementiert. In diesem Beispiel wir die Anzahl der Datensätze in einem Ordner gezählt. Dabei werden die Leserechte auf die Datensätze berücksichtigt.

[Serializable]
[Toolbox(EnumConfigurationType.GridConfigurationGuid)]
public class CalculatedRecordCollectionCount : CalculatedColumnBase
{
    public CalculatedRecordCollectionCount()
    {
        ToolboxName = "Record collection count column";
        Caption = "Record collection count column";
        ControlInitName = "RecordCollectionCount";
        ToolboxGroupName = Constants.Designer.ToolboxGroups.Grid.Basic;
        Icon = "sum";
        Id = [INSERT UNIQUE GUID]".ToGuid();
        ColumnType = Api.Enum.EnumValueConverter.GetEnumColumnTypeValue(EnumDataTypes.Int32);
    }

    public override CriteriaOperator GetCriteria(bool extendedValidation)
    {
        // Bedingung für den OrmBABAse join
        CriteriaOperator recordCondition = new OperandProperty("^." + nameof(OrmRelation.Target)) == new OperandProperty(nameof(OrmBABase.Oid)) & new OperandProperty(nameof(OrmBABase.IsInRecycleBin)) == new OperandValue(false);
        CriteriaOperator readCondition = CriteriaOperatorBuilder.ApplyReadPermissions(null, typeof(OrmBABase), new[] { EnumDataSource.BABase.ValueGuid });
        if (!CriteriaOperatorHelper.IsNull(readCondition))
            recordCondition &= readCondition;

        // OrmBABAse join
        JoinOperand recordJoin = new JoinOperand(nameof(OrmBABase), recordCondition, Aggregate.Exists, null);

        // Bedinung für den OrmRelation join
        CriteriaOperator relationCondition = new OperandProperty(nameof(OrmRelation.Source)) == new OperandProperty("^." + nameof(OrmBABase.Oid)) & new OperandProperty(nameof(OrmRelation.RelationType)) == new OperandValue(EnumRelationType.RecordCollection.ValueGuid);
        relationCondition &= recordJoin;

        // Rückgabe des OrmRelation joins
        return new JoinOperand(nameof(OrmRelation), relationCondition, Aggregate.Count, null);
    }

    public override Type GetDataType(GridViewConfiguration gridConfiguration)
    {
        return typeof(int);
    }
}