Et voici un petit exemple sympa (à compléter si nécessaire) pour un clonage complet.
Je précise que le clonage des lignes en option est lourd, donc à éviter. Je l'ai juste mis pour exemple.
Public Module Extensions
<System.Runtime.CompilerServices.Extension()> _
Public Function Clone(ByVal grid As DataGridView, cloneSource As Boolean) As DataGridView
'Création d'une nouvelle instance de grille
Dim newGrid As New DataGridView
'Copie des propriétés importantes
newGrid.AllowUserToAddRows = grid.AllowUserToAddRows
newGrid.AllowUserToDeleteRows = grid.AllowUserToDeleteRows
newGrid.AllowUserToOrderColumns = grid.AllowUserToOrderColumns
newGrid.AllowUserToResizeColumns = grid.AllowUserToResizeColumns
newGrid.AllowUserToResizeRows = grid.AllowUserToResizeRows
newGrid.AlternatingRowsDefaultCellStyle = grid.AlternatingRowsDefaultCellStyle.Clone
newGrid.AutoScrollOffset = grid.AutoScrollOffset
newGrid.AutoSize = grid.AutoSize
newGrid.AutoSizeColumnsMode = grid.AutoSizeColumnsMode
newGrid.AutoSizeRowsMode = grid.AutoSizeRowsMode
newGrid.BackgroundColor = grid.BackgroundColor
newGrid.BorderStyle = grid.BorderStyle
newGrid.CausesValidation = grid.CausesValidation
newGrid.CellBorderStyle = grid.CellBorderStyle
newGrid.ColumnHeadersBorderStyle = grid.ColumnHeadersBorderStyle
newGrid.ColumnHeadersDefaultCellStyle = grid.ColumnHeadersDefaultCellStyle.Clone
newGrid.ColumnHeadersHeight = grid.ColumnHeadersHeight
newGrid.ColumnHeadersHeightSizeMode = grid.ColumnHeadersHeightSizeMode
newGrid.ColumnHeadersVisible = grid.ColumnHeadersVisible
newGrid.EditMode = grid.EditMode
newGrid.Enabled = grid.Enabled
newGrid.EnableHeadersVisualStyles = grid.EnableHeadersVisualStyles
newGrid.Font = CType(grid.Font.Clone, Font)
newGrid.ForeColor = grid.ForeColor
newGrid.GridColor = grid.GridColor
newGrid.MultiSelect = grid.MultiSelect
newGrid.ReadOnly = grid.ReadOnly
newGrid.RowHeadersBorderStyle = grid.RowHeadersBorderStyle
newGrid.RowHeadersDefaultCellStyle = grid.RowHeadersDefaultCellStyle.Clone
newGrid.RowHeadersVisible = grid.RowHeadersVisible
newGrid.RowHeadersWidth = grid.RowHeadersWidth
newGrid.RowHeadersWidthSizeMode = grid.RowHeadersWidthSizeMode
newGrid.ScrollBars = grid.ScrollBars
newGrid.RowsDefaultCellStyle = grid.RowsDefaultCellStyle.Clone
newGrid.SelectionMode = grid.SelectionMode
newGrid.ShowCellErrors = grid.ShowCellErrors
newGrid.ShowCellToolTips = grid.ShowCellToolTips
newGrid.ShowEditingIcon = grid.ShowEditingIcon
newGrid.ShowRowErrors = grid.ShowRowErrors
newGrid.AutoGenerateColumns = grid.AutoGenerateColumns
'Copie des colonnes
For Each column As DataGridViewColumn In grid.Columns
newGrid.Columns.Add(CType(column.Clone(), DataGridViewColumn))
Next
'Copie de la source demandée
If cloneSource Then
'La grille d'origine est liée à une source
If grid.DataSource IsNot Nothing Then
'Pointe la meme source que la grille d'origine
newGrid.DataSource = grid.DataSource
Else
'Copie des lignes de la grille d'origine
For Each row As DataGridViewRow In grid.Rows
If Not row.IsNewRow Then 'On ne copie pas la ligne d'ajout
newGrid.Rows.Add(row.CloneWithValues())
End If
Next
End If
End If
Return newGrid
End Function
<System.Runtime.CompilerServices.Extension()> _
Public Function CloneWithValues(ByVal row As DataGridViewRow) As DataGridViewRow
'Clone la ligne d'origine
Dim newRow As DataGridViewRow = CType(row.Clone(), DataGridViewRow)
'Copie les valeurs
For index As Integer = 0 To row.Cells.Count - 1
newRow.Cells(index).Value = row.Cells(index).Value
Next
Return newRow
End Function
End Module
Grace aux extensions, l'utilisation est toute simple :
'Clone sans les lignes
Dim maCopie As DataGridView = DataGridViewSource.Clone(False)
'Clone avec les lignes
Dim maCopie As DataGridView = DataGridViewSource.Clone(True)
Ou DataGridViewSource est un objet de type DataGridView