Completed
Last Updated: 20 Feb 2014 15:14 by ADMIN
ADMIN
Dess | Tech Support Engineer, Principal
Created on: 29 Nov 2013 03:38
Category: GridView
Type: Bug Report
0
FIX. InvalidCastException when cancelling the CellValidating event with GridColorPickerEditor
To reproduce:
- add RadGridView and use the following code:

public Form1()
{
    InitializeComponent();

    List<ColorItem> list = new List<ColorItem>();
    List<Color> colors = new List<Color>()
    {
        Color.Red,
        Color.Black,
        Color.Blue,
        Color.Pink,
        Color.Green,
        Color.Yellow,
        Color.Purple,
        Color.Aqua,
        Color.Orange,
        Color.Fuchsia
    };

    for (int i = 0; i < 10; i++)
    {
        list.Add(new ColorItem(i, colors[i], colors[i].Name));
    }

    radGridView1.DataSource = list;
    radGridView1.CellValidating += radGridView1_CellValidating;
}

private void radGridView1_CellValidating(object sender, CellValidatingEventArgs e)
{
    if (e.ActiveEditor is GridColorPickerEditor && (Color)e.Value == Color.Aqua)
    {
        e.Cancel = true;
    }
}

Steps: 
1. Select the "Color" column of a certain cell and activate the editor;
2. Select Color.Aqua and press Tab to close the currently active GridColorPickerEditor;
As a result InvalidCastException is thrown.

Workaround: use a custom editor derivative of BaseGridEditor:
radGridView1.EditorRequired += radGridView1_EditorRequired;

private void radGridView1_EditorRequired(object sender, EditorRequiredEventArgs e)
{
    if (e.EditorType == typeof(GridColorPickerEditor))
    {
        e.Editor = new CustomColorEditor();
    }
}

public class CustomColorEditor : BaseGridEditor
{
    TypeConverter converter = TypeDescriptor.GetConverter(typeof(Color));

    protected override Telerik.WinControls.RadElement CreateEditorElement()
    {
        return new GridColorPickerElement();
    }

    public override object Value
    {
        get
        {
            GridColorPickerElement editorElement = this.EditorElement as GridColorPickerElement;
            return editorElement.GetColorValue();
        }
        set
        {
            GridColorPickerElement editorElement = this.EditorElement as GridColorPickerElement;
            if (value is Color)
            {
                editorElement.SetColorValue((Color)value);
            }
            else if (value is string)
            {
                editorElement.SetColorValue((Color)converter.ConvertFromString((string)value));
            }
        }
    }
}
0 comments