IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Forms Discussion :

[VB.NET] DatagridView avec colonnes de type RichTextBox


Sujet :

Windows Forms

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 46
    Points : 34
    Points
    34
    Par défaut [VB.NET] DatagridView avec colonnes de type RichTextBox
    Bonjour,

    Je souhaiterais avoir les cellules d'une colonne de mon DataGridView qui se comportent de la même sorte que des RichTextBox (À savoir, pouvoir changer la police, souligner etc... des mots particuliers).

    J'ai trouvé ceci sur le net, mais je ne sais pas du tout comment l'utiliser...
    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
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    Public Class Form1
     
        'RICHTEXTBOXCOLUMN CLASS
     
        Public Class richTextBoxColumn
            Inherits DataGridViewColumn
     
            Public Sub New()
                MyBase.New(New richTextBoxCell())
            End Sub
            Public Overrides Property CellTemplate() As DataGridViewCell
                Get
                    Return MyBase.CellTemplate
                End Get
                Set(ByVal value As DataGridViewCell)
                    If (value IsNot Nothing) AndAlso Not value.GetType().IsAssignableFrom(GetType(richTextBoxCell)) Then
                        Throw New InvalidCastException("Must be a richTextBoxCell")
                    End If
                    MyBase.CellTemplate = value
                End Set
            End Property
     
        End Class
     
        'RICHTEXTBOXCELL CLASS
        Public Class richTextBoxCell : Inherits DataGridViewTextBoxCell
     
            Public Overrides Sub InitializeEditingControl(ByVal rowIndex As Integer, ByVal initialFormattedValue As Object, ByVal dataGridViewCellStyle As System.Windows.Forms.DataGridViewCellStyle)
     
                MyBase.InitializeEditingControl(rowIndex, initialFormattedValue, dataGridViewCellStyle)
                Dim rtb As RichTextBox = CType(DataGridView.EditingControl, RichTextBox)
     
                If Me.Value Is Nothing Then
                    rtb.Text = CType(Me.DefaultNewRowValue, String)
                Else
                    rtb.Text = CType(Me.Value, String)
                End If
            End Sub
     
            Public Overrides ReadOnly Property EditType() As Type
                Get
                    Return GetType(richTextBoxEditingControl)
                End Get
            End Property
     
            Public Overrides Sub PositionEditingControl(ByVal setLocation As Boolean, ByVal setSize As Boolean, ByVal cellBounds As System.Drawing.Rectangle, ByVal cellClip As System.Drawing.Rectangle, ByVal cellStyle As System.Windows.Forms.DataGridViewCellStyle, ByVal singleVerticalBorderAdded As Boolean, ByVal singleHorizontalBorderAdded As Boolean, ByVal isFirstDisplayedColumn As Boolean, ByVal isFirstDisplayedRow As Boolean)
     
                MyBase.PositionEditingControl(True, setSize, New Rectangle(cellBounds.X + 1.3, cellBounds.Y, cellBounds.Width - 1.3, cellBounds.Height - 1), cellClip, cellStyle, singleVerticalBorderAdded, singleHorizontalBorderAdded, isFirstDisplayedColumn, isFirstDisplayedRow)
     
            End Sub
     
        End Class
     
     
        'RichTextBoxEditingControl class
     
        Class richTextBoxEditingControl : Inherits RichTextBox : Implements IDataGridViewEditingControl
            Private dataGridViewControl As DataGridView
            Private valueIsChanged As Boolean = False
            Private rowIndexNum As Integer
            Private editingCursor As Cursor
            Public Sub New()
            End Sub
     
            Public Property EditingControlFormattedValue() As Object Implements System.Windows.Forms.IDataGridViewEditingControl.EditingControlFormattedValue
                Get
                    Return Me.Text
                End Get
                Set(ByVal value As Object)
                    MyBase.Text = CType(value, String)
                End Set
            End Property
     
            Public Function GetEditingControlFormattedValue(ByVal context As System.Windows.Forms.DataGridViewDataErrorContexts) As Object Implements System.Windows.Forms.IDataGridViewEditingControl.GetEditingControlFormattedValue
                Return Me.Text
            End Function
     
            Public Sub ApplyCellStyleToEditingControl(ByVal dataGridViewCellStyle As DataGridViewCellStyle) Implements IDataGridViewEditingControl.ApplyCellStyleToEditingControl
                BackColor = dataGridViewCellStyle.BackColor
                ForeColor = dataGridViewCellStyle.ForeColor
                Me.BorderStyle = Windows.Forms.BorderStyle.None
                Me.Font = dataGridViewCellStyle.Font
                Multiline = False
            End Sub
     
            Public Property EditingControlRowIndex() As Integer Implements IDataGridViewEditingControl.EditingControlRowIndex
                Get
                    Return rowIndexNum
                End Get
                Set(ByVal value As Integer)
                    rowIndexNum = value
                End Set
            End Property
     
            Public Function EditingControlWantsInputKey(ByVal keyData As Keys, ByVal dataGridViewWantsInputKey As Boolean) As Boolean Implements IDataGridViewEditingControl.EditingControlWantsInputKey
                Select Case keyData And Keys.KeyCode
                    Case Keys.Up, Keys.Down, Keys.Return
                        dataGridViewWantsInputKey = True
                        Return False
                    Case Else
                        Return True
                End Select
            End Function
     
            Public Sub PrepareEditingControlForEdit(ByVal selectAll As Boolean) Implements IDataGridViewEditingControl.PrepareEditingControlForEdit
                selectAll = True
            End Sub
     
            Public ReadOnly Property RepositionEditingControlOnValueChange() As Boolean Implements IDataGridViewEditingControl.RepositionEditingControlOnValueChange
                Get
                    Return False
                End Get
            End Property
     
            Public Property EditingControlDataGridView() As DataGridView Implements IDataGridViewEditingControl.EditingControlDataGridView
                Get
                    Return dataGridViewControl
                End Get
                Set(ByVal value As DataGridView)
                    dataGridViewControl = value
                End Set
            End Property
     
            Public Property EditingControlValueChanged() As Boolean Implements IDataGridViewEditingControl.EditingControlValueChanged
                Get
                    Return valueIsChanged
                End Get
                Set(ByVal value As Boolean)
                    valueIsChanged = value
                End Set
            End Property
     
            Public ReadOnly Property EditingPanelCursor() As Cursor Implements IDataGridViewEditingControl.EditingPanelCursor
                Get
                    Return MyBase.Cursor
                End Get
            End Property
     
            Protected Overrides Sub OnTextChanged(ByVal e As System.EventArgs)
                valueIsChanged = True
                Me.EditingControlDataGridView.NotifyCurrentCellDirty(True)
                MyBase.OnTextChanged(e)
            End Sub
        End Class
    Je comprend qu'on créé un type "RichTextBoxColumn", qui est attribuable dans les propriété des colonnes de mon DataGridView, mais les cellules de ces colonnes se comportent comme des "TextBoxColumn" classiques.

    Une solution est vraiment nécessaire, quitte à devoir "tricher" un peu, l'essentiel est d'avoir un affichage des cellules comme des RichTextBox.

    Je vous remercie à l'avance, si quelque chose n'est pas clair, dites-le moi !

  2. #2
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 46
    Points : 34
    Points
    34
    Par défaut
    J'ai trouvé l'équivalent ce que je cherchais, mais en C#.
    http://www.codeproject.com/KB/grid/R...aGridView.aspx
    J'ai réussi à le convertir en VB.net grâce à un logiciel mais je ne comprend toujours pas comment ça marche, c'est très compliqué.

    Il y a beaucoup de feuilles pour un si petit projet et je me demande s'il y a moyen de réduire... et faire moins complexe.

    Edit: Le lien ci dessus est parfois HS, l’hébergeur semble instable, mais il on fonctionne à ce jour.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 46
    Points : 34
    Points
    34
    Par défaut
    Bonjour,

    Toujours pas de réponse, j'avance dans la compréhension et l'utilisation du code que j'ai trouvé sur le net mais c'est pas encore ça.

    Voici le projet sur lequel je travaille pour montrer l'état où j'en suis: http://www.megaupload.com/?d=EKTBQE63

    Actuellement, il est possible soit de taper directement le texte et le mettre en forme via des raccourcis clavier, peu pratique... (ça c'est ce qui été déjà fait dans l'application.)
    Il est désormais possible d'insérer, dans une cellule, du texte mis en forme tapé préalablement dans un RichTextBox séparé du DataGrid. La mise en forme du texte dans le RichTextBox se fait via des boutons "Italique/Gras/Souligné" ergonomiques.

    Comme je galère encore vraiment à l'utiliser, je n'arrive pas à faire en sorte que les boutons "Italique/Gras/Souligné" soient actifs ET pour la RichTextBox, ET pour la DataGrid...
    À vrai dire, je ne vois même pas comment atteindre les propriétés .rtf ou .SelectionFont d'une cellule de mon DataGridView.

    J'aimerais simplement supprimer les raccourcis claviers pour utiliser les boutons directement mais ça m'est compliqué...


    PS: Désolé pour le triple post, je fais juste en sorte de montrer ma progression, pour ceux qui auront un tel besoin plus tard étant donné que je n'ai absolument rien trouvé d'aussi abouti dans ce langage.

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 46
    Points : 34
    Points
    34
    Par défaut
    Bonjour "personne",

    J'ai encore avancé un peu, voici la dernière version de mon projet: http://www.megaupload.com/?d=FLUGDTW8

    Tout est plus intuitif et naturel, plus propre aussi. J'estime que, mis à part quelques détails, le projet type/squelette est terminé.


    Si je reposte, c'est pour savoir s'il y a possibilité d'exporter tout ceci sous forme de fonction ou de contrôle custom dans un autre projet et comment procéder.
    Je ne sais pas trop par quel bout commencer.

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 1
    Points : 1
    Points
    1
    Par défaut RichTextBox in DataGridView
    Ton lien ne fonctionne plus mais m’intéresse grandement (je suis en train d'implémenter un RichTextBox dans un DataGridView pour mettre en gras des chaînes de caractères).

    Si tu as un lien valide je suis preneur.

    Merci.

  6. #6
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    1 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2009
    Messages : 1 048
    Points : 2 201
    Points
    2 201
    Par défaut
    Hello,

    Histoire de participer à la discussion, je met un lien sur la doc MSDN sur le sujet. L'exemple concerne l'intégration d'un datetimepicker dans une colonne et non pas un richtextbox, mais ça peut aider à comprendre le concept.

    http://msdn.microsoft.com/en-us/libr...(v=vs.80).aspx

Discussions similaires

  1. DataGridView avec colonne CheckBox 2 (le retour xD)
    Par DarkSeiryu dans le forum Windows Forms
    Réponses: 8
    Dernier message: 19/02/2009, 15h04
  2. Group by avec colonne de type date
    Par lilye dans le forum SQL
    Réponses: 2
    Dernier message: 02/10/2008, 10h34
  3. Datagridview avec colonne de plusieurs types
    Par Laur3nT dans le forum Windows Forms
    Réponses: 3
    Dernier message: 08/07/2008, 16h33
  4. Réponses: 5
    Dernier message: 08/12/2006, 14h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo