)
We use cookies to give you the best experience on our website. If you continue to browse, then you agree to our privacy policy and cookie policy. (Last updated on: June 24, 2019).
Unfortunately, activation email could not send to your email. Please try again.
Syncfusion Feedback

How to place a UserControl in the header cell of WinForms GridGroupingControl?

Platform: WinForms |
Control: GridGroupingControl |
Published Date: April 30, 2011 |
Last Revised Date: February 12, 2020

Place a usercontrol in the header cell

In order to have a User Control in GridGroupingControl, the GridGenericCellModel and GridGenericCellRenderer classes have to be derived and the User Control that is designed must be made as a cellmodel in GridGroupingControl using these derived classes.

The following are the steps that need to be followed:

Step 1: The UserControl form is added to the Project and the required controls are dropped into it.

In the UserControl, the OnLayout() method is overridden for positioning the inner button controls.

C#

protected override void OnLayout(LayoutEventArgs levent)
{
    Hashtable ht = new Hashtable();
    foreach (Control c in Controls)
    {
        if (c is Button)
        {
            ht[c] = c.Location;
            c.Location = new Point(-1000, -1000);
        }
    }
    if (levent != null)
        //call the default layout method.
        base.OnLayout(levent);
 
    foreach (Control c in Controls)
    {
        //set the position of the control.
        if (c is Button)
            c.Location = (Point)ht[c];
    }
}
public void ForceLayout()
{
    //call the layout method to set the button locations.
    OnLayout(null);
}

VB

Protected Overrides Sub OnLayout(ByVal levent As LayoutEventArgs)
    Dim ht As New Hashtable()
    For Each c As Control In Controls
        If TypeOf c Is Button Then
            ht(c) = c.Location
            c.Location = New Point(-1000, -1000)
        End If
    Next c
    If levent IsNot Nothing Then
        'call the default layout method.
        MyBase.OnLayout(levent)
    End If
    For Each c As Control In Controls
        'set the position of the control.
        If TypeOf c Is Button Then
            c.Location = CType(ht(c), Point)
        End If
    Next c
End Sub
Public Sub ForceLayout()
    'call the layout method to override the properties.
    OnLayout(Nothing)
End Sub

Step 2: Create CustomControlCellModel by deriving it from GridGenericCellModel class.

C#

public class CustomControlCellModel : GridGenericControlCellModel
{
    #region Local Variables
    private static CustomControlCellRenderer customRenderer;
    private static CustomControl customControl;
    #endregion
    #region Constructor
    public CustomControlCellModel(GridModel grid)
           : base(grid)
    {
    }
    #endregion 
    #region Overridden Methods
    //creating Renderer
    public override GridCellRendererBase CreateRenderer(GridControlBase control)
    {
        customRenderer = new CustomControlCellRenderer(control, this);
        return customRenderer;
    }
    #endregion
    #region Getters & Setters
    //creating the static variable for the control
    public static CustomControl CustomControl
    {
        get
        {
            return customControl;
        }
        set
        {
            customControl = value;
        }
    }
    #endregion
}

VB

Public Class CustomControlCellModel
        Inherits GridGenericControlCellModel
    #Region "Local Variables"
    Private Shared customRenderer As CustomControlCellRenderer
    Private Shared customControl_Renamed As CustomControl
    #End Region
    #Region "Constructor"
    Public Sub New(ByVal grid As GridModel)
            MyBase.New(grid)
    End Sub
    #End Region
    #Region "Overridden Methods"
    'creating Renderer.
    Public Overrides Function CreateRenderer(ByVal control As GridControlBase) As GridCellRendererBase
        customRenderer = New CustomControlCellRenderer(control, Me)
        Return customRenderer
    End Function
    #End Region
    #Region "Getters & Setters"
    'creating the static variable for the control.
    Public Shared Property CustomControl() As CustomControl
        Get
            Return customControl_Renamed
        End Get
        Set(ByVal value As CustomControl)
            customControl_Renamed = value
        End Set
    End Property
    #End Region
End Class

Step 3: Create CustomControlCellRenderer from the GridGenericCellRenderer class and the UserControl is drawn accordingly to fit into the required cell header.

C#

//Creating CustomControlCellRenderer class.
public class CustomControlCellRenderer: GridGenericControlCellRenderer
{
    #region Constructor
    public CustomControlCellRenderer(GridControlBase grid, GridCellModelBase cellModel)
        : base(grid, cellModel)
    {
        SupportsFocusControl = true;
    }
    #endregion
    Control host = null;
    #region Overridden Methods
    protected override void OnDraw(Graphics g, Rectangle clientRectangle, int rowIndex, int colIndex, GridStyleInfo style)
    {
         if (host == null)
         {
              host = new Control();
              //add the control to the grid.
              Grid.Controls.Add(host);
         }
         CustomControl c = CustomControlCellModel.CustomControl;
         //set the control to the parentcontrol.
        FixControlParent(c);
        //set the specified size to the control.
        c.Bounds = clientRectangle;
        //assign the control position.
        c.ForceLayout();
        c.Refresh();
    }
    #endregion
}

VB

Public Class CustomControlCellRenderer
        Inherits GridGenericControlCellRenderer
    #Region "Constructor"
    Public Sub New(ByVal grid As GridControlBase, ByVal cellModel As GridCellModelBase)
        MyBase.New(grid, cellModel)
        SupportsFocusControl = True
    End Sub
    #End Region
    Private host As Control = Nothing
        #Region "Overridden Methods"
         Protected Overrides Sub OnDraw(ByVal g As Graphics, ByVal clientRectangle As Rectangle, ByVal rowIndex As Integer, ByVal colIndex As Integer, ByVal style As GridStyleInfo)
             If host Is Nothing Then
                 host = New Control()
                 'add the control to the grid.
                 Grid.Controls.Add(host)
             End If
             Dim c As CustomControl = CustomControlCellModel.CustomControl
                 'set the control to the parentcontrol.
                 FixControlParent(c)
                 'set the specified size to the control.
                 c.Bounds = clientRectangle
                 'assign the control position.
                 c.ForceLayout()
                 c.Refresh()
    End Sub
    #End Region
End Class

Step 4: You can create a new CellType by adding the instance of the derived CustomControlCellModel class into the gridGroupingControl’s CellModels.

C#

CustomControlCellModel.CustomControl = new CustomControl();
//adding the user control to the table model.
this.gridGroupingControl1.TableModel.CellModels.Add("CustomControl", new CustomControlCellModel(this.gridGroupingControl1.TableModel));

VB

CustomControlCellModel.CustomControl = New CustomControl()
'adding the usercontrol to the tablemodel.
Me.gridGroupingControl1.TableModel.CellModels.Add("CustomControl", New CustomControlCellModel(Me.gridGroupingControl1.TableModel))

Step 5: Set the CustomControl into the specific header cell.

C#

private void gridGroupingControl1_QueryCellStyleInfo(object sender, Syncfusion.Windows.Forms.Grid.Grouping.GridTableCellStyleInfoEventArgs e)
{
    //check the celltype is a headercell or not.
    if(e.TableCellIdentity.TableCellType == GridTableCellType.ColumnHeaderCell && e.TableCellIdentity.Column.Name == "Col3")
    {
        //assign the celltype as CustomControl.
        e.Style.CellType = "CustomControl";
    }
    e.Handled = true;
}

VB

Private Sub gridGroupingControl1_QueryCellStyleInfo(ByVal sender As Object, ByVal e As Syncfusion.Windows.Forms.Grid.Grouping.GridTableCellStyleInfoEventArgs)
    'check the celltype is a headercell or not.
    If e.TableCellIdentity.TableCellType = GridTableCellType.ColumnHeaderCell AndAlso e.TableCellIdentity.Column.Name = "Col3" Then
        'assign the celltype as CustomControl.
        e.Style.CellType = "CustomControl"
    End If
    e.Handled = True
End Sub

After applying the properties, the Grid is displayed as follows.

Show grid with the properties

Figure 1: Grid with the properties

Samples:

C#: UserControl

VB: UserControl

2X faster development

The ultimate WinForms UI toolkit to boost your development speed.
ADD COMMENT
You must log in to leave a comment

Please sign in to access our KB

This page will automatically be redirected to the sign-in page in 10 seconds.

Up arrow icon

Warning Icon You are using an outdated version of Internet Explorer that may not display all features of this and other websites. Upgrade to Internet Explorer 8 or newer for a better experience.Close Icon

Live Chat Icon For mobile
Live Chat Icon