Hello,

J'utilise une classe trouvée sur MSDN pour avoir des cellules avec des boutons désactivés dans un DataGridView.

Voici la classe en question :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
Imports System.Windows.Forms.VisualStyles
 
Public Class DataGridViewDisableButtonColumn
    Inherits DataGridViewButtonColumn
 
    Public Sub New()
        Me.CellTemplate = New DataGridViewDisableButtonCell()
    End Sub
End Class
 
Public Class DataGridViewDisableButtonCell
    Inherits DataGridViewButtonCell
 
    Private enabledValue As Boolean
    Public Property Enabled() As Boolean
        Get
            Return enabledValue
        End Get
        Set(ByVal value As Boolean)
            enabledValue = value
        End Set
    End Property
 
    ' Override the Clone method so that the Enabled property is copied. 
    Public Overrides Function Clone() As Object
        Dim Cell As DataGridViewDisableButtonCell = _
            CType(MyBase.Clone(), DataGridViewDisableButtonCell)
        Cell.Enabled = Me.Enabled
        Return Cell
    End Function
 
    ' By default, enable the button cell. 
    Public Sub New()
        Me.enabledValue = True
    End Sub
 
    Protected Overrides Sub Paint(ByVal graphics As Graphics, _
        ByVal clipBounds As Rectangle, ByVal cellBounds As Rectangle, _
        ByVal rowIndex As Integer, _
        ByVal elementState As DataGridViewElementStates, _
        ByVal value As Object, ByVal formattedValue As Object, _
        ByVal errorText As String, _
        ByVal cellStyle As DataGridViewCellStyle, _
        ByVal advancedBorderStyle As DataGridViewAdvancedBorderStyle, _
        ByVal paintParts As DataGridViewPaintParts)
 
        ' The button cell is disabled, so paint the border,   
        ' background, and disabled button for the cell. 
        If Not Me.enabledValue Then
 
            ' Draw the background of the cell, if specified. 
            If (paintParts And DataGridViewPaintParts.Background) = _
                DataGridViewPaintParts.Background Then
 
                Dim cellBackground As New SolidBrush(cellStyle.BackColor)
                graphics.FillRectangle(cellBackground, cellBounds)
                cellBackground.Dispose()
            End If
 
            ' Draw the cell borders, if specified. 
            If (paintParts And DataGridViewPaintParts.Border) = _
                DataGridViewPaintParts.Border Then
 
                PaintBorder(graphics, clipBounds, cellBounds, cellStyle, _
                    advancedBorderStyle)
            End If
 
            ' Calculate the area in which to draw the button. 
            Dim buttonArea As Rectangle = cellBounds
            Dim buttonAdjustment As Rectangle = _
                Me.BorderWidths(advancedBorderStyle)
            buttonArea.X += buttonAdjustment.X
            buttonArea.Y += buttonAdjustment.Y
            buttonArea.Height -= buttonAdjustment.Height
            buttonArea.Width -= buttonAdjustment.Width
 
            ' Draw the disabled button.                
            ButtonRenderer.DrawButton(graphics, buttonArea, _
                PushButtonState.Disabled)
 
            ' Draw the disabled button text.  
            If TypeOf Me.FormattedValue Is String Then
                TextRenderer.DrawText(graphics, CStr(Me.FormattedValue), _
                    Me.DataGridView.Font, buttonArea, SystemColors.GrayText)
            End If
 
        Else
            ' The button cell is enabled, so let the base class  
            ' handle the painting. 
            MyBase.Paint(graphics, clipBounds, cellBounds, rowIndex, _
                elementState, value, formattedValue, errorText, _
                cellStyle, advancedBorderStyle, paintParts)
        End If
    End Sub
 
End Class
Elle se trouve telle quelle sur la MSDN. Elle fait ce pourquoi elle est conçue (cad pouvoir désactiver le bouton d'une cellule) mais lors du passage de la souris sur la cellule ou lors du clic, la cellule scintille... J'imagine bien que c'est du au fait que la cellule est redessinée à chaque fois. Comment éviter cela ??

J'ai cherché du côté de Suspend/ResumeLayout mais je ne vois pas trop où les mettre (je ne suis même pas sûr que ce soit ce qu'il faut utiliser).

Quelqu'un a une idée ? Merci d'avance.

N.B. : Notez que ce n'est pas bien grave. S'il faut, cela restera comme ça. C'est juste que je suis perfectionniste...