Articles in this section
Category / Section

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

5 mins read

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

Did you find this information helpful?
Yes
No
Help us improve this page
Please provide feedback or comments
Comments (0)
Please sign in to leave a comment
Access denied
Access denied