Overblog Suivre ce blog
Editer l'article Administration Créer mon blog
24 février 2009 2 24 /02 /février /2009 17:33

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.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.

Partager cet article

Repost 0
Published by Cyril - dans VB.NET
commenter cet article

commentaires