Column Sorting

Click column headers to sort ascending/descending/none.

Loading...
View Code
<Grid Items="@orders">
    <Columns>
        <GridColumn Field="Id" Header="Order ID" Sortable="true" />
        <GridColumn Field="Customer" Header="Customer" Sortable="true" />
        <GridColumn Field="Amount" Header="Amount" Sortable="true" />
    </Columns>
</Grid>

Controlled Sorting State

External sort controls with programmatic state management.

Loading...
View Code
<Grid Items="@orders" @bind-State="@gridState">
    <Columns>
        <GridColumn Field="Amount" Sortable="true" />
    </Columns>
</Grid>

@code {
    private GridState gridState = new();
    
    private void SortByAmount()
    {
        // ✅ Natural object mutation - hash-based change detection
        gridState.SortDescriptors.Clear();
        gridState.SortDescriptors.Add(new GridSortDescriptor
        {
            Field = "Amount",
            Direction = GridSortDirection.Descending
        });
    }
}

Column Filtering

Text filter inputs in column headers for client-side filtering.

Loading...
View Code
<Grid Items="@orders">
    <Columns>
        <GridColumn Field="Customer" Sortable="true" Filterable="true" />
    </Columns>
</Grid>

Controlled Filtering State

External filter controls with custom dropdown and programmatic state.

Loading...
View Code
<Grid Items="@orders" @bind-State="@filterState" SuppressHeaderMenus="true">
    <Columns>
        <GridColumn Field="Status" />
    </Columns>
</Grid>

<Select @bind-Value="statusFilter">
    <SelectItem Value="@(-1)" TValue="int">All Statuses</SelectItem>
    <SelectItem Value="@((int)OrderStatus.Pending)" TValue="int">Pending</SelectItem>
    <!-- ... other status values ... -->
</Select>

@code {
    private GridState filterState = new();
    private int _statusFilter = -1;  // -1 = all
    private int statusFilter 
    { 
        get => _statusFilter;
        set 
        {
            if (_statusFilter != value)
            {
                _statusFilter = value;
                ApplyStatusFilter(value);
            }
        }
    }
    
    private void ApplyStatusFilter(int value)
    {
        // ✅ Natural object mutation - hash-based change detection
        filterState.FilterDescriptors.Clear();
        if (value >= 0)  // -1 = all, 0+ = enum values
        {
            filterState.FilterDescriptors.Add(new GridFilterDescriptor
            {
                Field = "Status",
                Operator = GridFilterOperator.Equals,
                Value = value  // Pass enum value as int - JS will detect as number filter
            });
        }
    }
}
An unhandled error has occurred. Reload 🗙