New to Telerik UI for WinForms? Download free 30-day trial

Using custom editors

This following snippet demonstrates how to replace the standard spin editor with a track bar.

All grid editors inherit from BaseGridEditor. So, you have to inherit from this class and override several methods:

public class TrackBarEditor : BaseGridEditor
{
    public override object Value
    {
        get
        {
            TrackBarEditorElement editor = (TrackBarEditorElement)this.EditorElement;
            return editor.Value;
        }
        set
        {
            TrackBarEditorElement editor = (TrackBarEditorElement)this.EditorElement;
            if (value != null && value != DBNull.Value)
            {
                editor.Value = Convert.ToInt32(value);
            }
            else
            {
                editor.Value = 0;
            }
        }
    }
    public override void BeginEdit()
    {
        base.BeginEdit();
        this.EditorElement.Focus();
        ((TrackBarEditorElement)this.EditorElement).TrackPositionChanged += new EventHandler(TrackBarEditor_TrackPositionChanged);
    }
    public override bool EndEdit()
    {
        ((TrackBarEditorElement)this.EditorElement).TrackPositionChanged -= new EventHandler(TrackBarEditor_TrackPositionChanged);
        return base.EndEdit();
    }
    void TrackBarEditor_TrackPositionChanged(object sender, EventArgs e)
    {
        OnValueChanged();
    }
    protected override RadElement CreateEditorElement()
    {
        return new TrackBarEditorElement();
    }
}

Public Class TrackBarEditor
    Inherits BaseGridEditor
    Public Overrides Property Value() As Object
        Get
            Dim editor As TrackBarEditorElement = CType(Me.EditorElement, TrackBarEditorElement)
            Return editor.Value
        End Get
        Set(ByVal value As Object)
            Dim editor As TrackBarEditorElement = CType(Me.EditorElement, TrackBarEditorElement)
            If value IsNot Nothing AndAlso value IsNot DBNull.Value Then
                editor.Value = Convert.ToInt32(value)
            Else
                editor.Value = 0
            End If
        End Set
    End Property
    Public Overrides Sub BeginEdit()
        MyBase.BeginEdit()
        Me.EditorElement.Focus()
        AddHandler (CType(EditorElement, TrackBarEditorElement)).TrackPositionChanged, AddressOf TrackBarEditor_TrackPositionChanged
    End Sub
    Public Overrides Function EndEdit() As Boolean
        RemoveHandler (CType(EditorElement, TrackBarEditorElement)).TrackPositionChanged, AddressOf TrackBarEditor_TrackPositionChanged
        Return MyBase.EndEdit()
    End Function
    Private Sub TrackBarEditor_TrackPositionChanged(ByVal sender As Object, ByVal e As EventArgs)
        OnValueChanged()
    End Sub
    Protected Overrides Function CreateEditorElement() As RadElement
        Return New TrackBarEditorElement()
    End Function
End Class

We use the standard RadTrackBar element in this example with some modification to enable keyboard navigation:

public class TrackBarEditorElement : RadTrackBarElement
{
    public TrackBarEditorElement()
    {
        this.CanFocus = true;
    }
    public event EventHandler TrackPositionChanged;
    protected override Type ThemeEffectiveType
    {
        get
        {
            return typeof(RadTrackBarElement);
        }
    }
    protected override SizeF MeasureOverride(SizeF availableSize)
    {
        int desiredHeight = 30;
        foreach (RadElement element in this.Children)
        {
            element.Measure(new SizeF(availableSize.Width, desiredHeight));
        }
        return new SizeF(1, desiredHeight);
    }
    protected override void OnPropertyChanged(RadPropertyChangedEventArgs e)
    {
        base.OnPropertyChanged(e);
        if (e.Property == RadTrackBarItem.ValueProperty
            && this.Parent != null
            && this.TrackPositionChanged != null)
        {
            this.TrackPositionChanged(this, EventArgs.Empty);
        }
    }
}

Public Class TrackBarEditorElement
    Inherits RadTrackBarElement
    Public Sub New()
        Me.CanFocus = True
    End Sub
    Public Event TrackPositionChanged As EventHandler
    Protected Overrides ReadOnly Property ThemeEffectiveType() As Type
        Get
            Return GetType(RadTrackBarElement)
        End Get
    End Property
    Protected Overrides Function MeasureOverride(ByVal availableSize As System.Drawing.SizeF) As System.Drawing.SizeF
        Dim desiredHeight As Integer = 30
        For Each element As RadElement In Me.Children
            element.Measure(New System.Drawing.SizeF(availableSize.Width, desiredHeight))
        Next element
        Return New System.Drawing.SizeF(1, desiredHeight)
    End Function
    Protected Overrides Sub OnPropertyChanged(ByVal e As RadPropertyChangedEventArgs)
        MyBase.OnPropertyChanged(e)
        If e.Property Is RadTrackBarItem.ValueProperty AndAlso Me.Parent IsNot Nothing AndAlso Me.TrackPositionChangedEvent IsNot Nothing Then
            RaiseEvent TrackPositionChanged(Me, EventArgs.Empty)
        End If
    End Sub
End Class

The EditorRequired event is the correct place to replace the default editor:

void radGridView1_EditorRequired(object sender, EditorRequiredEventArgs e)
{
    if (e.EditorType == typeof(GridSpinEditor))
    {
        e.EditorType = typeof(TrackBarEditor);
    }
}

Private Sub RadGridView1_EditorRequired(ByVal sender As Object, ByVal e As Telerik.WinControls.UI.EditorRequiredEventArgs) Handles RadGridView1.EditorRequired
    If e.EditorType Is GetType(GridSpinEditor) Then
        e.EditorType = GetType(TrackBarEditor)
    End If
End Sub

You can find a working version of this sample in our Demo application ( GridView -> Custom Editors ). To access the Live Demo simply click on the Windows Start button and type WinForms Demo. If you are not able to find the Live Demos using that approach you can also download it directly from here.

See Also

In this article