How to: Validate Cell Editors

  • 3 minutes to read

This example shows how to validate the focused cell's value. In this example, the product's price can be reduced by 30% if the product is discontinued.

View Example

<Window x:Class="DXGrid_ValidatingEditors.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:dxe="http://schemas.devexpress.com/winfx/2008/xaml/editors"
        xmlns:dxg="http://schemas.devexpress.com/winfx/2008/xaml/grid" 
        Title="Window1" Height="300" Width="600">
    <Grid>
        <dxg:GridControl x:Name="grid" ItemsSource="{Binding ProductList}">
            <dxg:GridControl.Columns>
                <dxg:GridColumn FieldName="ProductName">
                    <dxg:GridColumn.EditSettings>
                        <dxe:TextEditSettings AllowNullInput="False" />
                    </dxg:GridColumn.EditSettings>
                </dxg:GridColumn>
                <dxg:GridColumn FieldName="UnitPrice" Validate="GridColumn_Validate">
                    <dxg:GridColumn.EditSettings>
                        <dxe:SpinEditSettings DisplayFormat="c2" />
                    </dxg:GridColumn.EditSettings>
                </dxg:GridColumn>
                <dxg:GridColumn FieldName="Discontinued" />
            </dxg:GridControl.Columns>
            <dxg:GridControl.View>
                <dxg:TableView AutoWidth="True" HiddenEditor="TableView_HiddenEditor" />
            </dxg:GridControl.View>
        </dxg:GridControl>
    </Grid>
</Window>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Data;
using DevExpress.Xpf.Grid;
using System.Collections.ObjectModel;

namespace DXGrid_ValidatingEditors {
    public partial class Window1 : Window {
        public Window1() {
            InitializeComponent();
            this.DataContext = new MyViewModel();
        }

        private void GridColumn_Validate(object sender, GridCellValidationEventArgs e) {
            bool discontinued = ((Product)e.Row).Discontinued;
            if (discontinued) {
                double discount = 100 - (Convert.ToDouble(e.Value) * 100) / 
                                              Convert.ToDouble(e.CellValue);
                if (!(discount > 0 && discount <= 30)) {
                    e.IsValid = false;
                    e.ErrorType = DevExpress.XtraEditors.DXErrorProvider.ErrorType.Critical;
                    if (discount < 0) {
                        e.ErrorContent = string.Format("The price cannot be greater than ${0}",
                                                    Convert.ToDouble(e.CellValue));
                        return;
                    }
                    e.ErrorContent = string.Format(
                       "The discount cannot be greater than 30% (${0}). Please correct the price.",
                       Convert.ToDouble(e.CellValue)*0.7);
                }
            }
        }

        private void TableView_HiddenEditor(object sender, EditorEventArgs e) {
            if (e.Column.FieldName != "Discontinued") return;
            grid.View.CommitEditing();
        }
    }


    public class MyViewModel {
        public MyViewModel() {
            CreateList();
        }

        public ObservableCollection<Product> ProductList { get; set; }
        void CreateList() {
            ProductList = new ObservableCollection<Product>();
            Random r = new Random();
            for (int i = 0; i < 20; i++) {
                Product p = new Product(i);
                p.UnitPrice = r.Next(1, 50);
                ProductList.Add(p);
            }
        }
    }
    public class Product {
        public Product(int i) {
            ProductName = "Product" + i;
            Discontinued = i % 5 == 0;
        }

        public string ProductName { get; set; }
        public int UnitPrice { get; set; }
        public bool Discontinued { get; set; }
    }
}