Back to Devexpress

ColumnView.QueryCustomFunctions Event

windowsforms-devexpress-dot-xtragrid-dot-views-dot-base-dot-columnview-772e915c.md

latest10.5 KB
Original Source

ColumnView.QueryCustomFunctions Event

Allows you to add custom-function-based filters (for example, ‘discount is more than 15%’) to Excel-style pop-up filter menus and/or the filter editor.

Namespace : DevExpress.XtraGrid.Views.Base

Assembly : DevExpress.XtraGrid.v25.2.dll

NuGet Packages : DevExpress.Win.Grid, DevExpress.Win.Navigation

Declaration

csharp
[DXCategory("Behavior")]
public event QueryCustomFunctionsEventHandler QueryCustomFunctions
vb
<DXCategory("Behavior")>
Public Event QueryCustomFunctions As QueryCustomFunctionsEventHandler

Event Data

The QueryCustomFunctions event's data class is DevExpress.XtraGrid.Views.Grid.CustomFunctionEventArgs.

Remarks

To create a custom filter function (for example, ‘discount is more than 15%’), and add this function to Excel-style pop-up filter menus and/or the filter editor, do the following:

  • implement a custom function
  • register the function
  • add the function to pop-up filter menus and the filter editor in a QueryCustomFunctions event handler

Warning

Custom functions’ visibility depends on the ShowCustomFunctions property.

Example

The example below shows how to add the Black Friday Discount filter to a grid view.

csharp
using DevExpress.Data.Filtering;

IsBlackFridayDiscountFunction.Register();
gridView1.QueryCustomFunctions += OnQueryCustomFunctions;

void OnQueryCustomFunctions(object sender, CustomFunctionEventArgs e) {
    if(e.PropertyName == "Discount")
        e.Add(IsBlackFridayDiscountFunction.FunctionName);
}

public class IsBlackFridayDiscountFunction : ICustomFunctionDisplayAttributes {
    public const string FunctionName = "IsBlackFridayDiscount";
    static readonly IsBlackFridayDiscountFunction Instance = new IsBlackFridayDiscountFunction();
    IsBlackFridayDiscountFunction() { }
    public static void Register() {
        CriteriaOperator.RegisterCustomFunction(Instance);
    }
    public static bool Unregister() {
        return CriteriaOperator.UnregisterCustomFunction(Instance);
        }
    #region ICustomFunctionOperatorBrowsable Members
    public FunctionCategory Category {
        get { return FunctionCategory.Math; }
    }
    public string Description {
        get { return "The discount amount is 15% or more."; }
    }
    public bool IsValidOperandCount(int count) {
        return count == 1;
    }
    public bool IsValidOperandType(int operandIndex, int operandCount, Type type) {
        return DevExpress.Data.Summary.SummaryItemTypeHelper.IsNumericalType(type);
    }
    public int MaxOperandCount {
        get { return 1; }
    }
    public int MinOperandCount {
        get { return 1; }
    }
    #endregion
    #region ICustomFunctionDisplayAttributes
    public string DisplayName {
        get { return "Is Black Friday Discount"; }
    }
    public object Image {
        get { return "bo_price"; }
    }
    #endregion
    #region ICustomFunctionOperator Members
    public object Evaluate(params object[] operands) {
        double discount = Convert.ToDouble(operands[0]);
        return discount >= 0.15;
    }
    public string Name {
        get { return FunctionName; }
    }
    public Type ResultType(params Type[] operands) {
        return typeof(bool);
   }
    #endregion
}
vb
Imports DevExpress.Data.Filtering

IsBlackFridayDiscountFunction.Register()
AddHandler gridView1.QueryCustomFunctions, AddressOf OnQueryCustomFunctions

Private Sub OnQueryCustomFunctions(ByVal sender As Object, ByVal e As Data.Filtering.CustomFunctionEventArgs)
    If e.PropertyName = "Discount" Then
        e.Add(IsBlackFridayDiscountFunction.FunctionName)
    End If
End Sub

Public Class IsBlackFridayDiscountFunction
    Implements ICustomFunctionDisplayAttributes

    Public Const FunctionName As String = "IsBlackFridayDiscount"
    Private Shared ReadOnly Instance As New IsBlackFridayDiscountFunction()
    Private Sub New()
    End Sub
        '
    Public Shared Sub Register()
        CriteriaOperator.RegisterCustomFunction(Instance)
    End Sub
    Public Shared Function Unregister() As Boolean
        Return CriteriaOperator.UnregisterCustomFunction(Instance)
    End Function
    #Region "ICustomFunctionOperatorBrowsable Members"
    Public ReadOnly Property Category() As FunctionCategory Implements DevExpress.Data.Filtering.ICustomFunctionOperatorBrowsable.Category
        Get
            Return FunctionCategory.Math
        End Get
    End Property
    Public ReadOnly Property Description() As String Implements DevExpress.Data.Filtering.ICustomFunctionOperatorBrowsable.Description
        Get
            Return "The discount amount is 15% or more."
        End Get
    End Property
    Public Function IsValidOperandCount(ByVal count As Integer) As Boolean Implements DevExpress.Data.Filtering.ICustomFunctionOperatorBrowsable.IsValidOperandCount
        Return count = 1
    End Function
    Public Function IsValidOperandType(ByVal operandIndex As Integer, ByVal operandCount As Integer, ByVal type As Type) As Boolean Implements DevExpress.Data.Filtering.ICustomFunctionOperatorBrowsable.IsValidOperandType
        Return DevExpress.Data.Summary.SummaryItemTypeHelper.IsNumericalType(type)
    End Function
    Public ReadOnly Property MaxOperandCount() As Integer Implements DevExpress.Data.Filtering.ICustomFunctionOperatorBrowsable.MaxOperandCount
        Get
            Return 1
        End Get
    End Property
    Public ReadOnly Property MinOperandCount() As Integer Implements DevExpress.Data.Filtering.ICustomFunctionOperatorBrowsable.MinOperandCount
        Get
            Return 1
        End Get
    End Property
    #End Region
    #Region "ICustomFunctionDisplayAttributes"
    Public ReadOnly Property DisplayName() As String Implements ICustomFunctionDisplayAttributes.DisplayName
        Get
            Return "Is Black Friday Discount"
        End Get
    End Property
    Public ReadOnly Property Image() As Object Implements ICustomFunctionDisplayAttributes.Image
        Get
            Return "bo_price"
        End Get
    End Property
    #End Region
    #Region "ICustomFunctionOperator Members"
    Public Function Evaluate(ParamArray ByVal operands() As Object) As Object Implements DevExpress.Data.Filtering.ICustomFunctionOperator.Evaluate
        Dim discount As Double = Convert.ToDouble(operands(0))
        Return discount >= 0.15
    End Function
    Public ReadOnly Property Name() As String Implements DevExpress.Data.Filtering.ICustomFunctionOperator.Name
        Get
            Return FunctionName
        End Get
    End Property
    Public Function ResultType(ParamArray ByVal operands() As Type) As Type Implements DevExpress.Data.Filtering.ICustomFunctionOperator.ResultType
        Return GetType(Boolean)
    End Function
    #End Region
End Class

Tip

Run the following demo and click Open Solution for the complete example: XtraGrid.

In the case of a Code First data source, you can annotate data fields with the CustomFunction attribute.

csharp
[CustomFunction(IsBlackFridayDiscountFunction.FunctionName)]
public double Discount { get; set; }
vb
<CustomFunction(IsBlackFridayDiscountFunction.FunctionName)>
Public Property Discount() As Double

Tip

To add custom functions to filter menus, filter editors, and conditional formatting dialogs of all DevExpress controls in the application, use the static (Shared in VB) QueryCustomFunctions event.

The following code snippet (auto-collected from DevExpress Examples) contains a reference to the QueryCustomFunctions event.

Note

The algorithm used to collect these code examples remains a work in progress. Accordingly, the links and snippets below may produce inaccurate results. If you encounter an issue with code examples below, please use the feedback form on this page to report the issue.

how-to-create-and-register-custom-filter-editor-functions/CS/DXApplication5/Main.cs#L16

csharp
spinEdit.IsFloatValue = false;
gridView1.QueryCustomFunctions += OnQueryCustomFunctions;
gridView1.FilterEditorCreated += OnFilterEditorCreated;

how-to-create-and-register-custom-filter-editor-functions/VB/DXApplication5/Main.vb#L18

vb
spinEdit.IsFloatValue = False
AddHandler gridView1.QueryCustomFunctions, AddressOf OnQueryCustomFunctions
AddHandler gridView1.FilterEditorCreated, AddressOf OnFilterEditorCreated

See Also

Custom Function Based Filters

ShowCustomFunctions

ColumnView Class

ColumnView Members

DevExpress.XtraGrid.Views.Base Namespace