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 - DGV et heritage des cellules


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 - DGV et heritage des cellules
    Bonjour,

    je viens de réaliser, sur les conseils avisés d'Olsimare, une class DGVCell qui hérite de DataGridViewTextBoxCell.

    Cependant, je voudrais que cette class puisse accéder à une propriété des TextBox, à savoir SelectionStart (propriété qui n'existe pas dans les DataGridViewTextBoxCell) qui permet de connaitre la position du curseur dans le texte.
    Comme je ne peux pas faire de double héritage...

    Merci de votre aide.

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

    Ahah ! On commence à jouer sévère avec les DGV ici !

    En fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Public Class DataGridViewTextBoxEditingControl
    	Inherits TextBox
    	Implements IDataGridViewEditingControl
    Donc comme le DataGridViewTextBoxEditingControl est le control d'édition d'une cellule de type DataGridViewTextBoxCell, tu peux donc positionner le SelectionStart dans un overrides de sub InitializeEditingControl de DataGridViewTextBoxCell et le récupérer dans le DetachEditingControl.
    Seulement, tu ne l'auras pas en "direct" mais seulement à la fin de l'edition de la cellule...

    A quel le moment ou tu veux récupérer l'info ?

    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
    Salut Olsimare,

    Il s'agirait, en sortant d'une cellule, d'enregistrer la position du curseur dans la chaine de caractères, afin qu'en cas de clic dans une autre cellule, le nom de cette cellule s'affiche à la place du curseur...

    Typiquement je suis dans une cellule ou il y a écrit :

    "=Prix Unitaire * Taux1"

    et que je veuille remplacer "Prix Unitaire" par "Prix Total", j'efface "Prix Unitaire" et ma formule devient :

    "= * Taux1"

    et je clique dans la colonne "Prix Total" et ma formule devient :

    "=Prix Total * Taux1"


    Merci bien.

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

    Ok.

    Je pense qu'il faudrait stocker la position d'insertion dans la formule (que tu déclares comme une property readonly de ta DataGridViewTextBoxCell) lors du DetachEditingControl car tu ne dois plus être en mode édition sur la cellule un fois que tu cliques sur la colonne.

    Pour récupérer la position courante, un cast du control d'édition en TextBox te permettra d'utiliser SelectionStart.

    Cdt.

  5. #5
    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
    Salut Olsimare,

    Je rencontre un problème concernant un appel de fonction :

    J'utilise la class FormulaCell qu tu m'avais indiquée :

    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 FormulaDGVCell
        Inherits DataGridViewTextBoxCell
     
        'Public DocActif As Doc
     
        'Gère l'Affichage du Résultat
        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
     
    ...
     
    Dim s As String = CStr(Me.Value)
     
    ...
     
    If s.StartsWith("=") Then
     
       'Appel de la Fonction AttribVal()
       Dim StrCal As String = Doc.AttribVal(s, Me.RowIndex)
       ...
       ...
       return ...
    end if
    ...

    Or la fonction AttribVal est localisée dans la classe "Doc" (le formulaire qui contient le DGV)

    Dans un contexte de SDI, pas de problème, Doc.AttribVal(s, Me.RowIndex) fonctionne très bien.
    Mais dans un contexte de MDI, où Doc est un modèle instancié par :

    Doc.AttribVal(s, Me.RowIndex) ne marche plus, et c'est normal... mais MonDoc.AttribVal(s, Me.RowIndex) ne marche pas mieux...


    Pitié, de l'aide !

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

    En utilisant Me.DataGridView.FindForm, ça devrait le faire.

    Donc un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ctype(Me.DataGridView.FindForm, Doc).AttribVal(s, Me.RowIndex)
    PS : Par contre, ta technique lie définitivement le DGV et une form de type Doc, c'est donc assez moyen si tu veux mettre ton DGV sur n'importe quelle form.

    Cdt.

  7. #7
    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
    Dingue...
    Ca marche parfaitement !

    A priori, le DGV ne devrait être utilisé que sur ce formulaire.
    Comment est ce que je devrais faire si jamais je devais le mettre ailleurs ?

    il faudrait encapsuler le "FormulaDGV" pour le réutiliser ?

    Pour la 100ème fois merci.

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

    Citation Envoyé par House MD Voir le message
    Dingue...
    Ca marche parfaitement !
    Oui, j'essaye de mettre des truc qui marchent !

    Citation Envoyé par House MD Voir le message
    Comment est ce que je devrais faire si jamais je devais le mettre ailleurs ?

    il faudrait encapsuler le "FormulaDGV" pour le réutiliser ?
    Difficile à dire sans voir ce que tu fais dedans. C'est quoi AttribVal ?

    Cdt.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 21/03/2012, 23h48
  2. Formatage des Cellules selon leur type dans DGV
    Par ElTchoupi dans le forum Windows Forms
    Réponses: 8
    Dernier message: 18/11/2009, 16h36
  3. Réponses: 3
    Dernier message: 25/03/2008, 09h24
  4. [VB.NET]La bonne gestion des forms
    Par Wintermute dans le forum Windows Forms
    Réponses: 11
    Dernier message: 13/01/2004, 16h35
  5. [] [Excel] Fusionner des cellules
    Par SamyD dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 13/12/2002, 18h37

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