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

How to Use RadPopupEditor as a Custom Editor in RadGridView

Environment

Product Version Product Author
2021.3.119 RadGridView for WinForms Desislava Yordanova

Description

This tutorial demonstrates a sample approach how to create a custom editor in RadGridView that uses a RadPopupEditor hosting a grid. Typing into the editable part of RadPopupEditor filters the popup grid:

use-popup-editor-as-gridview-editor

This approach can be used to optimize the performance when filtering GridViewMultiComboBoxColumn.

Solution

Create a derivative of BaseGridEditor and add a RadPopupEditor and RadPopupContainer in its CreateEditorElement method. Note that the container can host any control that you need.


private void radGridView1_EditorRequired(object sender, EditorRequiredEventArgs e)
{
    if (this.radGridView1.CurrentColumn.Name == "Description")
    {
        MyEditor editor = new MyEditor();
        GridViewMultiComboBoxColumn mccbCol = this.radGridView1.CurrentColumn as GridViewMultiComboBoxColumn;
        editor.DataSource = mccbCol.DataSource;
        editor.DisplayMember = mccbCol.DisplayMember;
        e.Editor = editor;
    }
}

public class MyEditor : BaseGridEditor
{
    public string DisplayMember { get; set; }

    public object DataSource
    {
        get
        {
            {
                return this.grid.DataSource;
            }
        }
        set
        {
            this.grid.DataSource = value;
        }
    }

    public override void BeginEdit()
    {
        base.BeginEdit();
        this.popupEditor.TextBoxElement.TextBoxItem.TextBoxControl.Focus();
    }

    public override object Value
    {
        get
        {
            if (grid.CurrentRow != null)
            {
                return this.grid.CurrentRow.Cells[this.DisplayMember].Value;
            }
            return null;
        }
        set
        {
            if (value != null)
            {
                foreach (GridViewRowInfo row in grid.Rows)
                {
                    if (row.Cells[this.DisplayMember].Value == value)
                    {
                        grid.CurrentRow = row;
                        break;
                    }
                }
            }
        }
    }

    RadGridView grid = new RadGridView();
    RadPopupEditor popupEditor = new RadPopupEditor();
    RadPopupContainer container = new RadPopupContainer();

    protected override RadElement CreateEditorElement()
    {
        popupEditor.AssociatedControl = container;
        popupEditor.DropDownStyle = RadDropDownStyle.DropDown;
        container.Controls.Add(grid);
        grid.Dock = DockStyle.Fill;
        grid.EnableFiltering = true;
        grid.ShowFilteringRow = false;
        grid.ReadOnly = true;
        grid.EnableCustomFiltering = true;
        grid.AutoSizeColumnsMode = GridViewAutoSizeColumnsMode.Fill;
        grid.CustomFiltering += grid_CustomFiltering;
        this.popupEditor.TextBoxElement.TextChanged += popupEditor_TextChanged;

        RadHostItem item = new RadHostItem(popupEditor);
        return item;
    }

    private void popupEditor_TextChanged(object sender, EventArgs e)
    {
        grid.MasterTemplate.Refresh();
        popupEditor.PopupEditorElement.ShowPopup();
        this.popupEditor.PopupEditorElement.TextBoxElement.TextBoxItem.TextBoxControl.Focus();
    }

    private void grid_CustomFiltering(object sender, GridViewCustomFilteringEventArgs e)
    {
        string searchText = popupEditor.Text;
        if (searchText != null && searchText != string.Empty)
        {
            DataRowView rowView = e.Row.DataBoundItem as DataRowView;
            e.Handled = true;
            e.Visible = rowView.Row[this.DisplayMember].ToString().Contains(searchText);
        }
        else
        {
            e.Handled = false;
        }
    }
}