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);
}