Bonjour,
Je souhaite créer une colonne de DGV de type RichTextBox. Pour m'entrainer, j'ai repris l'exemple de MSDN sur le DateTimePicker qui fonctionne à merveille.

Je reste bloqué sur la surcharge de l'initialisation de la cellule.
Voici le code complet des 3 classes créées :

La colonne :
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
 
Public Class RichTextColumn
    Inherits DataGridViewColumn
 
    Public Sub New()
        MyBase.New(New RichTextCell())
    End Sub
 
    Public Overrides Property CellTemplate() As DataGridViewCell
        Get
            Return MyBase.CellTemplate
        End Get
        Set(ByVal value As DataGridViewCell)
 
            ' Ensure that the cell used for the template is a CalendarCell.
            If (value IsNot Nothing) AndAlso _
                Not value.GetType().IsAssignableFrom(GetType(RichTextCell)) _
                Then
                Throw New InvalidCastException("Must be a RichTextCell")
            End If
            MyBase.CellTemplate = value
 
        End Set
    End Property
End Class
La cellule :
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
 
Public Class RichTextCell
    Inherits DataGridViewCell
 
    Public Overrides Sub InitializeEditingControl(rowIndex As Integer, initialFormattedValue As Object, dataGridViewCellStyle As System.Windows.Forms.DataGridViewCellStyle)
        MyBase.InitializeEditingControl(rowIndex, initialFormattedValue, dataGridViewCellStyle)
        Dim ctl As RichTextEditingControl = CType(DataGridView.EditingControl, RichTextEditingControl)
        If (Me.Value Is Nothing) Then
            ctl.Rtf = CType(Me.DefaultNewRowValue, String)
        Else
            ctl.Rtf = CType(Me.Value, String)
        End If
    End Sub
 
    Public Overrides ReadOnly Property EditType As System.Type
        Get
            Return GetType(RichTextEditingControl)
        End Get
    End Property
 
    Public Overrides Property ValueType As System.Type
        Get
            Return GetType(String)
        End Get
        Set(value As System.Type)
 
        End Set
    End Property
 
    Public Overrides ReadOnly Property DefaultNewRowValue As Object
        Get
            Return String.Empty
        End Get
    End Property
End Class
L'editingControl :
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
 
Public Class RichTextEditingControl
    Inherits RichTextBox
    Implements IDataGridViewEditingControl
 
    Private dataGridViewControl As DataGridView
    Private valueIsChanged As Boolean = False
    Private rowIndexNum As Integer
 
    Public Sub ApplyCellStyleToEditingControl(dataGridViewCellStyle As System.Windows.Forms.DataGridViewCellStyle) Implements System.Windows.Forms.IDataGridViewEditingControl.ApplyCellStyleToEditingControl
        Me.Font = dataGridViewCellStyle.Font
        Me.ForeColor = dataGridViewCellStyle.ForeColor
        Me.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(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.Rtf
        End Get
        Set(value As Object)
            Me.Rtf = value
        End Set
    End Property
 
    Public Property EditingControlRowIndex As Integer Implements System.Windows.Forms.IDataGridViewEditingControl.EditingControlRowIndex
        Get
            Return rowIndexNum
        End Get
        Set(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(value As Boolean)
            valueIsChanged = value
        End Set
    End Property
 
    Public Function EditingControlWantsInputKey(keyData As System.Windows.Forms.Keys, 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 Not dataGridViewWantsInputKey
        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(context As System.Windows.Forms.DataGridViewDataErrorContexts) As Object Implements System.Windows.Forms.IDataGridViewEditingControl.GetEditingControlFormattedValue
        Return Me.Rtf
    End Function
 
    Public Sub PrepareEditingControlForEdit(selectAll As Boolean) Implements System.Windows.Forms.IDataGridViewEditingControl.PrepareEditingControlForEdit
 
    End Sub
 
    Public ReadOnly Property RepositionEditingControlOnValueChange As Boolean Implements System.Windows.Forms.IDataGridViewEditingControl.RepositionEditingControlOnValueChange
        Get
            Return False
        End Get
    End Property
 
    Protected Overrides Sub OnTextChanged(e As System.EventArgs)
        valueIsChanged = True
        Me.EditingControlDataGridView.NotifyCurrentCellDirty(True)
        MyBase.OnTextChanged(e)
    End Sub
End Class
Lors de l'exécution, la colonne est bien ajoutée au DGV mais impossible d'y accéder et la cellule ne s'affiche pas comme il le faut.
Je pense que le problème vient de la classe RichTextCell et plus particulièrement des propriétés .InitializeEditingControl et .ValueType.
Je ne sais pas quoi mettre d'autre comme type dans l'instruction GetType() ou dans Ctype().

EDIT: J'ai changé l'héritage de la cellule par DataGridViewTextBoxCell et ça semble fonctionner correctement au niveau affichage.

Comment afficher un texte au format RTF une fois que l’édition est terminée?