Customize editor of GridViewMultiComboBoxColumn throw cast exception

5 posts, 0 answers
  1. Le
    Le avatar
    3 posts
    Member since:
    Jan 2014

    Posted 06 Jan 2014 Link to this post

    Hi Telerik Team 

    I customize to inherit GridViewMultiComboBoxColumn, BaseGridBehavior and RadMultiColumnComboBox. Example MeGridBehavior (inherited form BaseGridBehavior), MeGridViewMultiComboBoxColumn(inherited form GridViewMultiComboBoxColumn)MeMultiColumnComboBox (inherited form RadMultiColumnComboBox), MeMultiColumnComboBoxElement (inherit RadMultiColumnComboBoxElement)

    when init GridView i set this.GridBehavior = new MeGridBehavior(), if column is Combobox editor i create MeGridViewMultiComboBoxColumn column and i  override event  OnEditorRequired and CreateMultiColunmnComboboxElement ;

    //On MeMultiColumnCombobox
    protected override RadMultiColumnComboBoxElement CreateMultiColumnComboBoxElement()
    {
        return new MeMultiColumnComboBoxElement(this.Name,this);
    }
     
    // on GridView
    protected override void OnEditorRequired(object sender, EditorRequiredEventArgs e)
    {
        if (this.CurrentColumn is MeGridViewMultiComboBoxColumn)
        {
            var column = this.CurrentColumn as MeGridViewMultiComboBoxColumn;
          MeMultiColumnComboBox cbx= CreateDataComboBox("Countries");
          e.Editor = cbx.MeMultiColumnComboBoxElement;        
        }
    }
     
    protected override void OnCellValidating(object sender, CellValidatingEventArgs e)
    {
        //if value not in list of countries ?
        var cbxCol = e.Column as MeGridViewMultiComboBoxColumn;
        var detectError = ComboBoxValidating(text, e);
        if (detectError)
        {
            e.Cancel = true;
            base.OnCellValidating(sender,e);
            ShowValidateError(); 
            return;
        
    }


    When i click to another cell it throw exeption on mouseup event of MeGridBehavior 

    Unable to cast object of type 'MeMultiColumnComboBoxElement' to type 'Telerik.WinControls.UI.BaseGridEditor'.

       at Telerik.WinControls.UI.GridViewEditManager.EndEditCore(Boolean validate, Boolean cancel)
       at Telerik.WinControls.UI.GridViewEditManager.CloseEditor()
       at Telerik.WinControls.UI.RadGridViewElement.CloseEditor()
       at Telerik.WinControls.UI.GridRowBehavior.OnMouseUpLeft(MouseEventArgs e)
       at Telerik.WinControls.UI.GridRowBehavior.OnMouseUp(MouseEventArgs e)
       at Telerik.WinControls.UI.BaseGridBehavior.OnMouseUp(MouseEventArgs e)
       at ......OnMouseUp(MouseEventArgs e) in d:\\MeProject\GridView\MeGridViewBehavior.cs

    This error throw when I update to telerik rad control winforms version Q3 2013  but it work with version Q1 2013

    Any one can help me ! 
    Thanks .
  2. Dess | Tech Support Engineer, Sr.
    Admin
    Dess | Tech Support Engineer, Sr.  avatar
    3282 posts

    Posted 09 Jan 2014 Link to this post

    Hello Le,

    Thank you for contacting Telerik Support.

    This is a known issue, concerning our GridViewMultiComboBoxColumn. We have it logged in our Public Issue Tracking System - PITS. You can track its progress, subscribe for status changes and add your vote/comment to it on the following link - PITS issue.

    Currently, the possible workaround that I can suggest is to set EditorManager.CloseEditorWhenValidationFails to true:
    radGridView1.EditorManager.CloseEditorWhenValidationFails = true;

    I hope this information helps. Should you have further questions, I would be glad to help.

    Regards,
    Desislava
    Telerik
    TRY TELERIK'S NEWEST PRODUCT - EQATEC APPLICATION ANALYTICS for WINFORMS.
    Learn what features your users use (or don't use) in your application. Know your audience. Target it better. Develop wisely.
    Sign up for Free application insights >>
  3. Le
    Le avatar
    3 posts
    Member since:
    Jan 2014

    Posted 14 Jan 2014 Link to this post

    Hello Desislava.
    Thank you very much about support.
    Your suggest help for me pass error and not throw exception , but, as you see in my code , onCellFormating event i want if value not in list i will show message and pointer must focus at current cell for end user type new value or select one value in my combobox editor, So, i set  
     CloseEditorWhenValidationFails =true   pointer focus to another cell. Can you help me If you have any idea about my issue,

    Thanks .
            
  4. Dess | Tech Support Engineer, Sr.
    Admin
    Dess | Tech Support Engineer, Sr.  avatar
    3282 posts

    Posted 17 Jan 2014 Link to this post

    Hello Le,

    Thank you for contacting us again.

    I can suggest an alternative solution for the GridViewMultiComboBoxColumn cancelling validation without changing the current focus to the next cell. The sample code uses a custom RadGridView:
    private void Form1_Load(object sender, EventArgs e)
    {
        this.categoriesTableAdapter.Fill(this.northwindDataSet.Categories);
    }
     
    private void radGridView1_CellValidating(object sender, CellValidatingEventArgs e)
    {
        int valueToCancel = 0;
        if (e.Column is GridViewMultiComboBoxColumn && e.ActiveEditor != null && e.ActiveEditor.Value != null)
        {
            if (int.TryParse(e.ActiveEditor.Value.ToString(), out valueToCancel) && valueToCancel == 1)
            {
                e.Cancel = true;
                MessageBox.Show("failed");
            }
        }
    }
     
    public class CustomGrid : RadGridView
    {
        protected override RadGridViewElement CreateGridViewElement()
        {
            return new CustomGridElement();
        }
    }
     
    public class CustomGridElement : RadGridViewElement
    {
        protected override GridViewEditManager CreateEditorManager()
        {
            return new CustomEditManager(this);
        }
    }
     
    public class CustomEditManager : GridViewEditManager
    {
        public CustomEditManager(RadGridViewElement gridViewElement) : base(gridViewElement)
        {
        }
     
        protected override bool EndEditCore(bool validate, bool cancel)
        {
            GridCellElement cell = this.GridViewElement.CurrentView.CurrentCell;
            bool validated = true;
     
            if (validate)
            {
                this.GridViewElement.TableElement.BeginUpdate();
                validated = !RaiseCellValidatingEvent(cell.RowInfo, cell.ColumnInfo,
                    this.ActiveEditor.Value, cell.Value);
                this.GridViewElement.TableElement.EndUpdate(false);
                if (!validated && !CloseEditorWhenValidationFails)
                {
                    BaseGridEditor baseGridEditor = this.ActiveEditor as BaseGridEditor;
                    RadElement element = null;
                    if (baseGridEditor == null)
                    {
                        element = this.ActiveEditor as RadElement;
                    }
                    else
                    {
                        element = baseGridEditor.EditorElement; 
                    }
     
                    RadTextBoxItem textBoxItem = element != null ? element.FindDescendant<RadTextBoxItem>() : null;
     
                    if (textBoxItem != null)
                    {
                        textBoxItem.HostedControl.Focus();
                    }
     
                    return validated;
                }
                else
                {
                    validate = false;
                }
            }
            return base.EndEditCore(validate, cancel);
        }
     
        private bool RaiseCellValidatingEvent(GridViewRowInfo row, GridViewColumn column,
            object newValue, object oldValue)
        {
            CellValidatingEventArgs cellValidating = new CellValidatingEventArgs(row,
                column, newValue, oldValue, ActiveEditor);
            this.GridViewElement.Template.EventDispatcher.RaiseEvent<CellValidatingEventArgs>
                (EventDispatcher.CellValidating, this, cellValidating);
            return cellValidating.Cancel;
        }
    }

    Please do not hesitate to contact us if you have any additional questions.

    Regards,
    Desislava
    Telerik
    TRY TELERIK'S NEWEST PRODUCT - EQATEC APPLICATION ANALYTICS for WINFORMS.
    Learn what features your users use (or don't use) in your application. Know your audience. Target it better. Develop wisely.
    Sign up for Free application insights >>
  5. Le
    Le avatar
    3 posts
    Member since:
    Jan 2014

    Posted 17 Jan 2014 Link to this post

    Thanks Desislava and Telerik team very much .It's really very helpfull for me.
    Best regard!
Back to Top