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 :
- Anchor : Right
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.TextChangedEnd Sub
End Class
Maintenant nous allons créer la classe TextBoxSelectCell qui va hériter de DataGridViewTextBoxCell
Code :
Public Class TextBoxSelectCell
Inherits DataGridViewTextBoxCellPublic Sub New()
End SubPublic 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 PropertyPublic Overrides ReadOnly Property ValueType() As Type
Get
Return GetType(String)
End Get
End PropertyPublic Overrides ReadOnly Property DefaultNewRowValue() As Object
Get
Return String.Empty
End Get
End PropertyEnd Class
Ensuite il faut créer la classe TextBoxSelectColumn qui va hérité de DataGridViewColumn
Code :
Public Class TextBoxSelectColumn
Inherits DataGridViewColumnPublic Sub New()
MyBase.New(New TextBoxSelectCell())
End SubPublic 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 IfMyBase.CellTemplate = value
End Set
End PropertyEnd 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 IDataGridViewEditingControlPrivate dataGridViewControl As DataGridView
Private rowIndexNum As Integer
Private valueIsChanged As Boolean = FalsePublic 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 SubPublic 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 PropertyPublic 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 PropertyPublic 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 PropertyPublic 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 PropertyPublic 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.PageUpReturn True
Case Else
Return False
End SelectEnd Function
Public ReadOnly Property EditingPanelCursor() As System.Windows.Forms.Cursor Implements System.Windows.Forms.IDataGridViewEditingControl.EditingPanelCursor
Get
Return MyBase.Cursor
End Get
End PropertyPublic Function GetEditingControlFormattedValue(ByVal context As System.Windows.Forms.DataGridViewDataErrorContexts) As Object Implements System.Windows.Forms.IDataGridViewEditingControl.GetEditingControlFormattedValue
Return Me.TextBoxText.Text.ToString()
End FunctionPublic Sub PrepareEditingControlForEdit(ByVal selectAll As Boolean) Implements System.Windows.Forms.IDataGridViewEditingControl.PrepareEditingControlForEdit
'pas de formatage
End SubPublic ReadOnly Property RepositionEditingControlOnValueChange() As Boolean Implements System.Windows.Forms.IDataGridViewEditingControl.RepositionEditingControlOnValueChange
Get
Return False
End Get
End PropertyProtected 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 SubEnd 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.