Il est souvent nécessaire de créer ses propres control utilisateur pour éditer la cellule d’un DataGridView.
Prenons l’exemple couramment utilisé dans les logiciels de gestion, d’un control qui permet à l’aide d’un bouton de faire apparaitre la liste des articles, afin d’ajouter l’un d’eux à une
facture.
Nous allons d’abord créer un control utilisateur que nous allons appeler TextBoxSelect.
Dans ce control se trouvent 2 contrôles :
- Un TextBox dont le nom sera TextBoxText
- Un Button dont le nom sera ButtonSelect
Assurez-vous que les propriétés de TextBoxText soient les suivantes :
- Anchor : Top, Bottom, Left, Right
Assurez-vous que les propriétés de ButtonSelect soient les suivantes :
Assurez-vous que les propriétés de votre control utilisateur personnalisé TextBoxSelect soient les suivantes :
- AutoSizeMode : GrowAndShrink
- AutoSize : True
Code du control utilisateur TextBoxSelect :
Public Class TextBoxSelect
Protected Overridable Sub TextBoxText_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles TextBoxText.TextChanged
End Sub
End Class
Maintenant nous allons créer la classe TextBoxSelectCell qui va hériter de DataGridViewTextBoxCell
Code :
Public Class TextBoxSelectCell
Inherits DataGridViewTextBoxCell
Public Sub New()
End Sub
Public Overrides Sub InitializeEditingControl(ByVal rowIndex As Integer, ByVal initialFormattedValue As Object, ByVal dataGridViewCellStyle As DataGridViewCellStyle)
MyBase.InitializeEditingControl(rowIndex, initialFormattedValue, dataGridViewCellStyle)
Dim ctl As TextBoxSelectEditingControl = CType(DataGridView.EditingControl, TextBoxSelectEditingControl)
ctl.TextBoxText.Text = CStr(Me.Value)
End Sub
Public Overrides ReadOnly Property EditType() As Type
Get
Return GetType(TextBoxSelectEditingControl)
End Get
End Property
Public Overrides ReadOnly Property ValueType() As Type
Get
Return GetType(String)
End Get
End Property
Public Overrides ReadOnly Property DefaultNewRowValue() As Object
Get
Return String.Empty
End Get
End Property
End Class
Ensuite il faut créer la classe TextBoxSelectColumn qui va hérité de DataGridViewColumn
Code :
Public Class TextBoxSelectColumn
Inherits DataGridViewColumn
Public Sub New()
MyBase.New(New TextBoxSelectCell())
End Sub
Public Overrides Property CellTemplate() As System.Windows.Forms.DataGridViewCell
Get
Return MyBase.CellTemplate
End Get
Set(ByVal value As System.Windows.Forms.DataGridViewCell)
If Not (value Is Nothing) AndAlso Not value.GetType().IsAssignableFrom(GetType(TextBoxSelectCell)) Then
Throw New InvalidCastException("La cellule doit être un TextBoxSelectCell")
End If
MyBase.CellTemplate = value
End Set
End Property
End Class
Il ne nous reste plus qu’a créer la classe TextBoxSelectEditingControl qui va hériter de notre control utilisateur TextBoxSelect et qui va implémenter
IDataGridViewEditingControl
Code :
Public Class TextBoxSelectEditingControl
Inherits TextBoxSelect
Implements IDataGridViewEditingControl
Private dataGridViewControl As DataGridView
Private rowIndexNum As Integer
Private valueIsChanged As Boolean = False
Public Sub ApplyCellStyleToEditingControl(ByVal dataGridViewCellStyle As System.Windows.Forms.DataGridViewCellStyle) Implements
System.Windows.Forms.IDataGridViewEditingControl.ApplyCellStyleToEditingControl
Me.TextBoxText.Font = dataGridViewCellStyle.Font
Me.TextBoxText.ForeColor = dataGridViewCellStyle.ForeColor
Me.TextBoxText.BackColor = dataGridViewCellStyle.BackColor
End Sub
Public Property EditingControlDataGridView() As System.Windows.Forms.DataGridView Implements System.Windows.Forms.IDataGridViewEditingControl.EditingControlDataGridView
Get
Return dataGridViewControl
End Get
Set(ByVal value As System.Windows.Forms.DataGridView)
dataGridViewControl = value
End Set
End Property
Public Property EditingControlFormattedValue() As Object Implements System.Windows.Forms.IDataGridViewEditingControl.EditingControlFormattedValue
Get
Return Me.TextBoxText.Text.ToString
End Get
Set(ByVal value As Object)
Me.TextBoxText.Text = CStr(value)
End Set
End Property
Public Property EditingControlRowIndex() As Integer Implements System.Windows.Forms.IDataGridViewEditingControl.EditingControlRowIndex
Get
Return rowIndexNum
End Get
Set(ByVal value As Integer)
rowIndexNum = value
End Set
End Property
Public Property EditingControlValueChanged() As Boolean Implements System.Windows.Forms.IDataGridViewEditingControl.EditingControlValueChanged
Get
Return valueIsChanged
End Get
Set(ByVal value As Boolean)
valueIsChanged = value
End Set
End Property
Public Function EditingControlWantsInputKey(ByVal keyData As System.Windows.Forms.Keys, ByVal dataGridViewWantsInputKey As Boolean) As Boolean Implements
System.Windows.Forms.IDataGridViewEditingControl.EditingControlWantsInputKey
Select Case keyData And Keys.KeyCode
Case Keys.Left, Keys.Up, Keys.Down, Keys.Right, _
Keys.Home, Keys.End, Keys.PageDown, Keys.PageUp
Return True
Case Else
Return False
End Select
End Function
Public ReadOnly Property EditingPanelCursor() As System.Windows.Forms.Cursor Implements System.Windows.Forms.IDataGridViewEditingControl.EditingPanelCursor
Get
Return MyBase.Cursor
End Get
End Property
Public Function GetEditingControlFormattedValue(ByVal context As System.Windows.Forms.DataGridViewDataErrorContexts) As Object Implements
System.Windows.Forms.IDataGridViewEditingControl.GetEditingControlFormattedValue
Return Me.TextBoxText.Text.ToString()
End Function
Public Sub PrepareEditingControlForEdit(ByVal selectAll As Boolean) Implements System.Windows.Forms.IDataGridViewEditingControl.PrepareEditingControlForEdit
'pas de formatage
End Sub
Public ReadOnly Property RepositionEditingControlOnValueChange() As Boolean Implements
System.Windows.Forms.IDataGridViewEditingControl.RepositionEditingControlOnValueChange
Get
Return False
End Get
End Property
Protected Overrides Sub TextBoxText_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs)
valueIsChanged = True
Me.EditingControlDataGridView.NotifyCurrentCellDirty(True)
MyBase.TextBoxText_TextChanged(sender, e)
End Sub
End Class
Voilà, votre EditingControl personnalisé est terminé ! Il ne vous reste plus qu’a gérer l’évènement click de ButtonSelect pour que votre liste d’articles apparaisse.
Pour utiliser ce control dans un DataGridView il suffit de faire comme ceci :
Code :
Dim colSelect As New TextBoxSelectColumn
colSelect.DataPropertyName = "codeArticle"
colSelect.HeaderText = "Code article"
monDataGridView.Columns.Add(colSelect)
Dans cet exemple nous considérons que le DataGridView est lié à une base de donnée et que la cellule est lié au champ codeArticle de cette base de données.