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

How to Add a Button to Header Cells in RadGridView

Environment

Product Version Product Author
2019.3.1022 RadGridView for WinForms Desislava Yordanova

Description

This tutorial demonstrates how to add a button element in the header cell for a certain column.

add-button-to-header-cells 001

Solution

In order to add a button in the header cell, it is suitable to create a custom column which uses a custom GridHeaderCellElement. A tutorial for creating custom cells is available in the following help article: Creating custom cells

public RadForm1()
{
    InitializeComponent(); 

    MyGridViewDecimalColumn myColumn = new MyGridViewDecimalColumn();
    myColumn.FieldName = "ProductID";
    myColumn.HeaderText = "My column";
    myColumn.MinWidth = 150;
    this.radGridView1.Columns.Add(myColumn);
}

public class MyGridViewDecimalColumn : GridViewDecimalColumn
{
    public override Type GetCellType(GridViewRowInfo row)
    {
        if (row is GridViewTableHeaderRowInfo)
        {
            return typeof(MyGridHeaderCellElement);
        }
        return base.GetCellType(row);
    }
}

public class MyGridHeaderCellElement : GridHeaderCellElement
{ 
    public MyGridHeaderCellElement(GridViewColumn column, GridRowElement row) : base(column, row)
    {
    }

    protected override Type ThemeEffectiveType
    {
        get
        {
            return typeof(GridHeaderCellElement);
        }
    }

    RadButtonElement btn = new RadButtonElement();

    protected override void CreateChildElements()
    {
        base.CreateChildElements();

        btn.Text = "Click";
        btn.Click += btn_Click;
        this.Children.Add(btn);
    }

    private void btn_Click(object sender, EventArgs e)
    {
        RadMessageBox.Show("Clicked");
    }

    public override bool IsCompatible(GridViewColumn data, object context)
    {
        return data is MyGridViewDecimalColumn && context is GridTableHeaderRowElement;
    }

    protected override SizeF MeasureOverride(SizeF availableSize)
    {
        SizeF s = base.MeasureOverride(availableSize);
        btn.Measure(availableSize);
        return s;
    }

    protected override SizeF ArrangeOverride(SizeF finalSize)
    {
        SizeF s = base.ArrangeOverride(finalSize);
        RectangleF clientRect = GetClientRectangle(finalSize);
        btn.Arrange(new RectangleF(clientRect.X + clientRect.Width - btn.DesiredSize.Width - 5,
            clientRect.Y + btn.DesiredSize.Height / 3, btn.DesiredSize.Width, btn.DesiredSize.Height));

        return s;
    }
}

In this article