Surcharger un DataGridView avec un événement Enable pour chaque ligne

guilleto Messages postés 256 Date d'inscription jeudi 23 octobre 2003 Statut Membre Dernière intervention 20 mars 2013 - 29 mars 2011 à 15:00
guilleto Messages postés 256 Date d'inscription jeudi 23 octobre 2003 Statut Membre Dernière intervention 20 mars 2013 - 29 mars 2011 à 20:07
Bonjour à toutes et tous,

Je voudrais savoir quand réaliser un contrôle à partir d'un DataGridView et lui ajouter une propriété de ligne permettant de désactiver une ou plusieurs lignes sans affecter les autres ?

Si quelqu'un a déjà travailler sur le sujet merci de me faire signe.

Par avance merci

Olivier

6 réponses

foliv57 Messages postés 420 Date d'inscription vendredi 17 novembre 2006 Statut Membre Dernière intervention 15 juillet 2014 9
29 mars 2011 à 15:53
Bonjour,

La propriété ReadOnly ne convient pas ?
monDataGridView.Rows(X).ReadOnly = True
0
guilleto Messages postés 256 Date d'inscription jeudi 23 octobre 2003 Statut Membre Dernière intervention 20 mars 2013 1
29 mars 2011 à 16:40
Bonjour foliv57,

Merci de cette réponse, mais en fait j'ai plusieurs DataGridView et en fonction des 3 premiers (ligne sélectionnée sur chacun d'eux) je rempli le 4ème, il faut donc que se soit affiché mais pas sélectionnable.

Si tu as une solution cela m’intéresse.

Par avance merci

Olivier
0
foliv57 Messages postés 420 Date d'inscription vendredi 17 novembre 2006 Statut Membre Dernière intervention 15 juillet 2014 9
29 mars 2011 à 17:25
C'est vrai que dans ce cas, je ne vois pas de propriété native.

Par contre une petite astuce serait de créer un CellStyle par défaut pour les lignes non autorisées afin de donner l'illusion que la ligne ne peut pas être sélectionnée en jouant sur les couleurs.

Et lors du parcours de la colloection SelectedRows de controler le stype par défaut pour déterminer si la ligne est autorisée.

Un exemple pour illustrer :

1) Le style par défaut pour les lignes bloquées
'Création du style pour les lignes non autorisées
Dim unselectedStyle As DataGridViewCellStyle = Me.DataGridView1.DefaultCellStyle.Clone()
unselectedStyle.SelectionBackColor = unselectedStype.BackColor
unselectedStyle.SelectionForeColor = unselectedStype.ForeColor

2) Comment bloquer les lignes
'Bloque la sélection des lignes 2 et 4
Me.DataGridView1.Rows(1).DefaultCellStyle = unselectedStyle
Me.DataGridView1.Rows(3).DefaultCellStyle = unselectedStyle

3) Comment lister les lignes sélectionnées
'Pour chaque lignes sélectionnées
For Each ligne As DataGridViewRow In Me.DataGridView1.SelectedRows

   'Si la ligne n'a pas de style par défaut ou que le tag du style    
   'n'est pas "disabled" c'est que la ligne est autorisée
   If (Not ligne.HasDefaultCellStyle) OrElse _
         (CType(ligne.DefaultCellStyle.Tag, String) <> "disabled") Then
      Console.WriteLine("La ligne {0} est sélectionnée", ligne.Index + 1)
   End If

Next

4) Pour autoriser à nouveau une ligne
Me.DataGridView1.Rows(1).DefaultCellStyle = Nothing


Je sais que ca reste du bricolage, mais ca dépanne.
0
foliv57 Messages postés 420 Date d'inscription vendredi 17 novembre 2006 Statut Membre Dernière intervention 15 juillet 2014 9
29 mars 2011 à 19:16
Maintenant pour répondre à la vrai question du poste, vous pouvez faire une surcharge de la classe DataGridViewRow comme ceci :
Public Class DataGridViewRowCustom
    Inherits DataGridViewRow

    Private _enabled As Boolean

    Public Property Enabled As Boolean
        Get
            Return _enabled
        End Get
        Set(ByVal value As Boolean)
            _enabled = value
            If (Me.DataGridView IsNot Nothing) Then Me.DataGridView.Refresh()
        End Set
    End Property

    Public Sub New()
        MyBase.New()
        _enabled = True
    End Sub

    Protected Overrides Sub Paint(ByVal graphics As System.Drawing.Graphics, ByVal clipBounds As System.Drawing.Rectangle, ByVal rowBounds As System.Drawing.Rectangle, ByVal rowIndex As Integer, ByVal rowState As System.Windows.Forms.DataGridViewElementStates, ByVal isFirstDisplayedRow As Boolean, ByVal isLastVisibleRow As Boolean)

        'Test si l'état de la ligne contient l'état sélectionné et que la sélection est interdite
        If (((rowState And DataGridViewElementStates.Selected) DataGridViewElementStates.Selected) And (_enabled False)) Then
            'On supprime l'état sélectionné de l'état actuel de la ligne
            rowState = (rowState Xor DataGridViewElementStates.Selected)
        End If

        MyBase.Paint(graphics, clipBounds, rowBounds, rowIndex, rowState, isFirstDisplayedRow, isLastVisibleRow)
    End Sub

End Class


1) Ajouter une ligne à la grille
Me.DataGridView1.Rows.Add(New DataGridViewRowCustom())


2) Bloquer ou autoriser une ligne
CType(Me.DataGridView1.Rows(1), DataGridViewRowCustom).Enabled = False


3) Lister les lignes sélectionnées
For Each ligne As DataGridViewRow In Me.DataGridView1.SelectedRows
    Dim custRow = TryCast(ligne, DataGridViewRowCustom)
    'Test si la ligne est bien une ligne custom (car si vous autorisez l'ajout,
    'la ligne d'ajout n'est pas une DataGridViewRowCustom)
    'et si la ligne est autorisée
    If (custRow IsNot Nothing) AndAlso custRow.Enabled Then
         Console.WriteLine("La ligne {0} est sélectionnée", ligne.Index + 1)
    End If
Next
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
foliv57 Messages postés 420 Date d'inscription vendredi 17 novembre 2006 Statut Membre Dernière intervention 15 juillet 2014 9
29 mars 2011 à 19:42
Désolé, je corrige avec une meilleur version
Public Class DataGridViewRowCustom
    Inherits DataGridViewRow

    Private _enabled As Boolean

    Public Property Enabled As Boolean
        Get
            Return _enabled
        End Get
        Set(ByVal value As Boolean)
            _enabled = value
            'Si la ligne était sélectionnée et qu'elle passe bloquée on supprime la ligne de la sélection
            If (Me.Selected And (value False)) Then Me.Selected False
        End Set
    End Property

    Public Sub New()
        MyBase.New()
        _enabled = True
    End Sub

    Protected Overrides Sub Paint(ByVal graphics As System.Drawing.Graphics, ByVal clipBounds As System.Drawing.Rectangle, ByVal rowBounds As System.Drawing.Rectangle, ByVal rowIndex As Integer, ByVal rowState As System.Windows.Forms.DataGridViewElementStates, ByVal isFirstDisplayedRow As Boolean, ByVal isLastVisibleRow As Boolean)

        'Test si l'état de la ligne contient l'état sélectionné et que la sélection est interdite
        If (((rowState And DataGridViewElementStates.Selected) DataGridViewElementStates.Selected) And (_enabled False)) Then
            'On supprime l'état sélectionné de l'état actuel de la ligne
            rowState = (rowState Xor DataGridViewElementStates.Selected)
            'On supprime la ligne de la sélection
            Me.Selected = False
        End If

        MyBase.Paint(graphics, clipBounds, rowBounds, rowIndex, rowState, isFirstDisplayedRow, isLastVisibleRow)
    End Sub

End Class


Cette version permet de lister les lignes sélectionnées plus simplement car il suffit de parcourir la collection SelectedRows
For Each ligne As DataGridViewRow In Me.DataGridView1.SelectedRows
     Console.WriteLine("La ligne {0} est sélectionnée", ligne.Index + 1)
Next
0
guilleto Messages postés 256 Date d'inscription jeudi 23 octobre 2003 Statut Membre Dernière intervention 20 mars 2013 1
29 mars 2011 à 20:07
Merci foliv57,

Je teste cela dès que je retrouve mon PC avec VS2010.

Olivier
0
Rejoignez-nous