Eine Mehrfachgruppierung zeigt einen Datensatz mehrfach an. Beispielsweise abhängig davon wie viele Auswahlwerte gewählt worden sind.

Das Steuerelement wird wie vorher implementiert, nur für das Drag & Drop wird anstatt IGridDataColumnControl das Interface IGridGroupingColumnControl implementiert.

Der Renderer implementiert IGridColumnMultiGroupControlRenderer welches das Interface IGridColumnControlRenderer erweitert. Im Folgenden werden nur die Unterschiede zu den vorherigen Renderern beschrieben.

Datenbankabfrage

In der Formel für die Abfrage in GetQueryProperties muss diese Gruppierung generiert werden. In dem Beispiel werden Firmen nach den “Weiteren Bearbeiter” gruppiert.

OperandProperty entityTilteCriteria = CriteriaOperatorBuilder.GetCommonField(EnumCommonFields.EntityTitle.InternalName);
CriteriaOperator criteria = CriteriaOperatorBuilder.GetSourcesJoin(false, EnumRelationType.Author, EnumAuthorRelationSubTypes.DefaultGuid, aggregatedExpression: entityTilteCriteria);

Zusätzlicher Filter

In der Regel möchte man, dass Datensätze, die keine Werte haben auch nicht in der Ansicht auftauchen, um leere Kategorien zu vermeiden. Dazu kann man in GetFilterExpression eine Filter-Formel definieren, die den anderen Filtern hinzugefügt wird. Filter-Formeln müssen einen booleschen Wert zurückliefern.

public virtual CriteriaOperator GetFilterExpression(GridColumnBase column)
{
    return CriteriaOperatorBuilder.GetSourcesJoin(false, EnumRelationType.Author, EnumAuthorRelationSubTypes.DefaultGuid, onlyRelations: true, aggregator: Aggregate.Exists);
}

Eindeutige Zeilen-ID

Ansichten benötigen eine eindeutige Zeilen-ID. Falls dies in einer mehrfachgruppierten Ansicht nicht korrekt ist verhält sich die Ansicht nicht korrekt. Beispielsweise tauchen leere Zeilen auf. In flachen Ansichten wird automatisch dafür die Oid des Datensatzes verwendet. In unserem Beispiel nehmen wir die Oid des Relationsdatensatzes.

public virtual CriteriaOperator GetKeyExpression(GridColumnBase column)
{
    OperandProperty relationOid = CriteriaOperatorBuilder.GetField(nameof(OrmRelation.Oid));
    return CriteriaOperatorBuilder.GetSourcesJoin(false, EnumRelationType.Author, EnumAuthorRelationSubTypes.DefaultGuid, onlyRelations: true, aggregatedExpression: relationOid);
}