Wie für die Maskensteuerelemente werden auch für die Ansichten Spalten und Renderer benötigt. Mit dem Attribut GridColumnControlRenderer
wird der Renderer dem Steuerelement zugeordnet. Der Renderer muss das Interface IGridColumnControlRenderer
implementieren.
[GridColumnControlRenderer(typeof(MyTextColumn))]
public class MyTextColumnDefaultRenderer : IGridColumnControlRenderer
{ ... }
Datenbankabfrage
Der wesentliche Aspekt bei der Performance von Ansichten ist die Laufzeit der Datenbankabfragen. Es ist sehr wichtig darauf zu achten, dass die Ansicht mit einer Abfrage geladen werden kann. Beispielsweise kann es passieren, das pro angezeigter Zeile weitere Abfragen gestartet werden, dies ist unbedingt zu vermeiden. Auch auf möglicherweise fehlende Indices ist zu achten.
Für die Abfrage wird die Formelsprache eingesetzt, die den Criteria Operators von Dev Express entspricht. In CriteriaOperatorBuilder
befinden sich eine Reihe von Hilfsmethoden zum Erstellen solcher Formeln.
Um in Formeln Joins zu ermöglichen, kann man sogenannte Free Joins verwenden. Dev Express optimiert die Abfragen, das heißt identische Free Joins in verschiedenen Spalten münden in einen SQL Join.
In GridRendererHelper
befinden sich Hilfsmethoden, die zum Erstellen der GridViewQueryColumnProperties
genutzt werden können. Zu beachten ist, dass sowohl in GetQueryProperties
als auch später GetRenderColumns
eine Liste zurück geliefert wird. Damit ist es möglich, dass pro Steuerelement mehrere Spalten generiert werden können. Dies können auch unsichtbare Spalten sein, mit deren Hilfe Funktionalitäten gebaut werden können.
In diesem Beispiel werden die Bestandteile von GridViewQueryColumnProperties
mit Hilfe von Methoden aus GridRendererHelper
gefüllt.
Name
Der eindeutige Spaltenname. Auch bei mehrfacher Verwendung des Steuerelements, muss der Name eindeutig sein.DataType
Der C# Datentyp der Spalte. Dieser sollte in der Regel dem Typen entsprechen, der im Steuerelement festgelegt wurde. Durch die Hilfsmethode wird dies sichergestellt.Criteria
Die Formel zum Berechnen der Spalte
public IEnumerable<GridViewQueryColumnProperties> GetQueryProperties(GridViewConfiguration configuration, GridColumnBase column)
{
MyTextColumn myTextColumn = (MyTextColumn)column;
string columnName = GridRendererHelper.GetDataColumnBaseGridColumnName(configuration, myTextColumn);
Type dataType = GridRendererHelper.GetDataColumnBaseDataType(configuration, myTextColumn);
CriteriaOperator criteria = GridRendererHelper.GetDataColumnBaseCriteria(configuration, myTextColumn);
return new[] { new GridViewQueryColumnProperties { Name = columnName, DataType = dataType, Criteria = criteria } };
}
Um die konfigurierbare Eigenschaft des Steuerelements in der Formel zu berücksichtigen, muss dies eingefügt werden. Dabei die Hilfsmethode GetDataColumnBaseCriteria
verwendet, um auf die Formel für den Zugriff auf die Spalte zu bekommen. Diese kann dann weiter verwendet werden.
CriteriaOperator criteria;
if (!string.IsNullOrEmpty(myTextColumn.DefaultValue))
{
CriteriaOperator fieldValue = GridRendererHelper.GetDataColumnBaseCriteria(configuration, myTextColumn);
CriteriaOperator expression = fieldValue == new OperandValue(null);
CriteriaOperator ifpart = new OperandValue(myTextColumn.DefaultValue);
CriteriaOperator elsepart = fieldValue;
criteria = new FunctionOperator(FunctionOperatorType.Iif, expression, ifpart, elsepart);
}
else
criteria = GridRendererHelper.GetDataColumnBaseCriteria(configuration, myTextColumn);
Rendern
Für das Rendern werden MVCxGridViewColumn von DevExpress benötigt. Mit der Hilfsmethode CreateDataBaseRenderColumn
wird automatisch eine entsprechende Spalte mit allen Einstellungen generiert und man muss lediglich die gewünschten Änderungen anschließend durchführen. In unserem Beispiel ist dies das Setzen von EncodeHTML
.
public IEnumerable<MVCxGridViewColumn> GetRenderColumns(GridViewConfiguration configuration, GridColumnBase column, GridViewRendererParameter parameter)
{
MyTextColumn myTextColumn = (MyTextColumn)column;
MVCxGridViewColumn gridColumn = GridRendererHelper.CreateDataBaseRenderColumn(configuration, myTextColumn, parameter);
gridColumn.PropertiesEdit.EncodeHtml = myTextColumn.EncodeHTML;
return new[] { gridColumn };
}
Hat man in GetQueryPropertiesq
einen anderen Spaltennamen definiert, muss dieser hier ebenfalls neu auf Name
und FieldName
gesetzt werden. Bei Name wird der Präfix “Col” benötigt.
gridColumn.Name = "Col" + columnName;
gridColumn.FieldName = columnName;
Rendern und Abfragen unterdrücken
Die Abfrage der Spalten und das Render der Spalten kann man mit Hilfe von CanColumnBeRendered
unterdrücken.
public bool CanColumnBeRendered(GridViewConfiguration configuration, GridColumnBase column)
{
return true;
}