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

VB.NET Discussion :

VB.Net : Formules dans DatagridView


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    306
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 306
    Par défaut VB.Net : Formules dans DatagridView
    Bonjour à tous,

    J'ai pas mal cherché et rien trouvé (visiblement ca n'interesse personne...) concernant la possibilité de mettre des formules dans certaines cellules d'un datagridview (facon Excel).
    Comme dans Excel, on pourrait soit voir la formule soit le résultat.

    Tout aide sera fortement appréciée.
    Mille merci.

  2. #2
    Membre Expert
    Avatar de olsimare
    Inscrit en
    Décembre 2006
    Messages
    1 183
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 183
    Par défaut
    Bonjour.

    Oula ! Tu vas déjà avoir besoin d'une sorte d'Eval pour évaluer tes formules.

    J'avais trouvé ce code pas mal du tout :
    http://www.codeproject.com/KB/recipe...ew=Quick&fr=51

    Ensuite, le mieux me semble de créer un type de contrôle d'édition personnalisé de type Textbox.
    Tu dois créer ton control d'édition :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Friend Class EvalTextBoxEditingControl
        Inherits TextBox
        Implements IDataGridViewEditingControl
    ...
    Dans ce control, tu géres la saisie et la transformation de la formule en valeur affichable.
    Tu ajoutes aussi un propriété "Formula" pour stocker ta formule.

    Puis un type de cellule qui utilise ce contrôle d'édition :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Public Class EvalTextBoxCell
        Inherits DataGridViewTextBoxCell
    ...
    Ta propriété "Formula" étant un propriété de la cellule devra être redescendu ici.

    Et enfin un type de colonne qui utilise ce type de cellule.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Public Class EvalTextBoxColumn
        Inherits DataGridViewColumn
    ...
    Il y a de nombreux exemple de création de cellule personnalisée pour un DGV.

    Par exemple :
    http://msdn2.microsoft.com/en-us/library/7tas5c80.aspx

    Voilà, c'est une solution.

    Cdt.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    306
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 306
    Par défaut
    Tout d'abord, MERCI de ta réponse.
    Ensuite, un ENORME merci pour le premier lien (super dll qui répond exactement à ce que je veux faire.)

    Il faut que je creuse les bouts de codes que tu m'as envoyés et notamment le point sur les "formulas" qui je pense permet de gérer un "double affichage" : soit la formule soit la valeur... (je débute en .net)

    J'aurai encore surement des questions mais ce début de solution m'aide incroyablement !

    Encore merci !

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    306
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 306
    Par défaut
    Olsimare,

    Pourrais-tu m'expliquer succintement le principe pour stocker à la fois la formule et son résultat ?

    Merci.

  5. #5
    Membre Expert
    Avatar de olsimare
    Inscrit en
    Décembre 2006
    Messages
    1 183
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 183
    Par défaut
    Bonjour.

    En me relisant, je me suis dit qu'il y avait plus simple ...

    En fait, le mieux reste de faire l'eval au besoin pour l'affichage. Donc dans la value de la cellule, on stocke soit une formule, soit une valeur formelle.

    Donc pas besoin de EditingControl.

    Un exemple :
    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
     
    Option Strict On
    Option Explicit On
     
    Public Class FormulaDGVColumn
        Inherits DataGridViewTextBoxColumn
     
        Public Sub New()
            MyBase.New()
            MyBase.CellTemplate = New FormulaDGVCell
        End Sub
        Public Overrides Property CellTemplate() As DataGridViewCell
            Get
                Return MyBase.CellTemplate
            End Get
            Set(ByVal value As DataGridViewCell)
                If Not (value Is Nothing) AndAlso _
                    Not value.GetType().IsAssignableFrom(GetType(FormulaDGVCell)) _
                    Then
                    Throw New InvalidCastException("Le template n'est pas de type FormulaDGVCell")
                End If
                MyBase.CellTemplate = value
            End Set
        End Property
     
    End Class
     
    Public Class FormulaDGVCell
        Inherits DataGridViewTextBoxCell
     
        Protected Overrides Function GetFormattedValue( _
        ByVal value As Object, _
        ByVal rowIndex As Integer, _
     ByRef cellStyle As DataGridViewCellStyle, _
        ByVal valueTypeConverter As System.ComponentModel.TypeConverter, _
        ByVal formattedValueTypeConverter As System.ComponentModel.TypeConverter, _
        ByVal context As DataGridViewDataErrorContexts _
    ) As Object
            If Me.RowIndex < 0 Then Return Nothing
     
            Dim s As String = CStr(Me.Value)
     
            If Left(s, 1) = "=" Then
                Return "Eval(" & Mid(s, 2) & ")"
            Else
                Return s
            End If
        End Function
     
        Public Overrides Sub InitializeEditingControl(ByVal rowIndex As Integer, ByVal initialFormattedValue As Object, ByVal dataGridViewCellStyle As DataGridViewCellStyle)
     
            MyBase.InitializeEditingControl(rowIndex, initialFormattedValue, dataGridViewCellStyle)
     
            Dim dgvtb As DataGridViewTextBoxEditingControl = CType(DataGridView.EditingControl, DataGridViewTextBoxEditingControl)
     
            dgvtb.Text = CStr(Me.Value)
     
        End Sub
     
    End Class
    Dans une form tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
            Dim c As New FormulaDGVColumn
            Me.DataGridView1.Columns.Add(c)
            Dim c1 As New FormulaDGVColumn
            Me.DataGridView1.Columns.Add(c1)
    C'est tout bête et ça ne joue plus que sur l'affichage.

    Nota : je te laisse le soin de cabler l'utilisation de l'Eval avec la gestion des erreurs potentielles.

    EDIT : Ah oui, j'avais oublié initialement le InitializeEditingControl qui permet de ne pas passer bêtement le texte affiché dans la cellule au control d'édition (teste sans tu verras tout l'intérêt).

    Cdt.

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    306
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 306
    Par défaut
    Bonjour olsimare,

    Merci encore pour ton aide et ta patience.

    Effectivement cette solution ma parait plus simple (d'autant que je débute.)
    J'étais parti sur une autre piste encore plus simple mais surement bricol' :

    2 datatable en parallèle l'une affichant les valeurs l'autre les formules... ca marchait pas mal mais c'est long (400 000 cellules environ...)
    Donc je préfère ta solution.

    Le seul soucis, il faut que je gère certains trucs : j'avais écrit ca :


    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
    Private Sub DGV_CellEndEdit(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DGV.CellEndEdit
     
            If DGV.Item(e.ColumnIndex, e.RowIndex).Value.ToString = "=" Then
                DGV.ReadOnly = True
                DGVCol = e.ColumnIndex
                DGVLine = e.RowIndex
                boolEgal = True
                StrCal = ""
            End If
     
        End Sub
     
        Private Sub DGV_CellClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DGV.CellClick
     
            If boolEgal Then
                DGV.Item(DGVCol, DGVLine).Value &= DGV.Columns(e.ColumnIndex).HeaderText
                StrCal &= CInt(DGV.Item(e.ColumnIndex, e.RowIndex).Value)
     
            End If
     
     
        End Sub
     
        Private Sub DGV_KeyPress(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles DGV.KeyPress
     
            If boolEgal = True Then
                If e.KeyChar = Microsoft.VisualBasic.ChrW(Keys.Return) Then
     
                    People1.Rows(DGVLine).Item(DGVCol) = DGV.Item(DGVCol, DGVLine).Value
                    Me.CalculCell()
     
                    boolEgal = False
                    DGV.ReadOnly = False
                Else
                    DGV.Item(DGVCol, DGVLine).Value &= e.KeyChar
                    StrCal &= e.KeyChar
                End If
            End If
     
        End Sub
     
        'Test Validité + Calcul
        Public Sub CalculCell()
     
     
            DGV.Item(DGVCol, DGVLine).Value = Evl.Parse(StrCal).value
        End Sub

    qui lors de la saisie d'un "=" mettait le DGV en lecture seule et me permettait de saisir tout dans la cellule de départ.

    A l'arrivée après avoir fait "Enter", j'avais une cellule contenant :

    "=Tarif A*Degressif B"

    et une strCal : "23*0.1" que je calculait grâce à Eval3.

    ... Avec ton systeme, je ne sais pas ou caser ce code...


    On avance on avance...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Pb date dans datagridview [vb.net] [sql server 2008]
    Par RATIER dans le forum Windows Forms
    Réponses: 4
    Dernier message: 22/10/2009, 10h00
  2. [VB.NET] Checkbox dans DataGridView
    Par horzy dans le forum Windows Forms
    Réponses: 6
    Dernier message: 09/02/2009, 15h24
  3. Selection d'une plage de cellules dans DatagridView [Vb.Net]
    Par papy75 dans le forum Windows Forms
    Réponses: 4
    Dernier message: 17/06/2008, 12h03
  4. [VB.net] Exécuter code après ajout dans datagridview
    Par collaud_vb dans le forum Windows Forms
    Réponses: 1
    Dernier message: 27/09/2006, 11h45
  5. [VB.NET] Calculs dans une colonne d'un datagridview
    Par boulete dans le forum Windows Forms
    Réponses: 3
    Dernier message: 31/03/2006, 15h11

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