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 :

Mise à jour d'une cellule après avoir modifié la valeur d'un DataGridViewComboBoxColumn


Sujet :

VB.NET

  1. #1
    Membre du Club Avatar de sibama
    Profil pro
    Inscrit en
    Août 2008
    Messages
    147
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 147
    Points : 55
    Points
    55
    Par défaut Mise à jour d'une cellule après avoir modifié la valeur d'un DataGridViewComboBoxColumn
    Bonjour,

    J'ai un formulaire qui contient un datagridview qui ressemble à ça:
    Nom : Nouvelle image bitmap.jpg
Affichages : 321
Taille : 69,9 Ko
    Ce qui s'affiche dans la colonne valeur est le contenu de Variable mais en fonction de Format, on peut avoir un affichage en :
    - Décimal
    - Binaire
    - ASCII
    - Hexadécimal

    Le problème c'est que quand je change la valeur du format d'affichage via le combobox de la ligne, la mise à jour de la cellule "Valeur" associée ne se met à jour que lorsque je clique dessus avec la souris.

    Je récupère pourtant bien le changement d'index de la combobox via ce code (trouvé sur internet je n'ai malheureusement pas les compétences informatique pour trouver ça tout seul ):
    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
     
        Private Sub DataGridViewSuiviVariables_EditingControlShowing(sender As Object, e As DataGridViewEditingControlShowingEventArgs) Handles DataGridViewSuiviVariables.EditingControlShowing
     
            ' Pour récuperer l'évènement comme quoi on vient de modifier la combobox d'affichage du format des valeurs
            Static dgvEditCombo As DataGridViewComboBoxEditingControl = Nothing
            Dim combo As DataGridViewComboBoxEditingControl = TryCast(e.Control, DataGridViewComboBoxEditingControl)
            If combo IsNot Nothing Then
                If dgvEditCombo IsNot Nothing Then
                    RemoveHandler dgvEditCombo.SelectedIndexChanged, AddressOf DataGridViewSuiviVariables_SelectedIndexChanged
                End If
                dgvEditCombo = combo
                AddHandler dgvEditCombo.SelectedIndexChanged, AddressOf DataGridViewSuiviVariables_SelectedIndexChanged
            End If
        End Sub
     
     
        Private Sub DataGridViewSuiviVariables_SelectedIndexChanged(sender As Object, e As EventArgs)
            Dim combo = TryCast(sender, DataGridViewComboBoxEditingControl)
            Dim cell = combo.EditingControlDataGridView.CurrentCell
     
            Me.DataGridViewSuiviVariables.Refresh()
     
        End Sub
    Mais le Me.DataGridViewSuiviVariables.Refresh() ne marche pas.... pourtant je passe bien dedans après le changement de la combobox quand je mets un point d'arrêt dans le code.

    Pour info, la gestion de ce qui est à afficher dans valeur est géré dans l’événement CellPainting du datagridview.

    Quelqu'un aurait une idée de comment forcer la cellule Valeur à se redessiner après le changement d'index de la combobox associée?
    Ce n'est pas parce que l'on allume la bougie de quelqu'un avec sa lanterne que l'on se prive de lumière.

  2. #2
    Modérateur
    Avatar de Sankasssss
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 842
    Points : 4 232
    Points
    4 232
    Par défaut
    Bonjour,

    où faites-vous la modification de la cellule ?

    Car dans DataGridViewSuiviVariables_SelectedIndexChanged vous ne faite que rafraîchir le datagridview.

  3. #3
    Membre du Club Avatar de sibama
    Profil pro
    Inscrit en
    Août 2008
    Messages
    147
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 147
    Points : 55
    Points
    55
    Par défaut
    Bonjour Sankasssss,

    Les calculs pour la mise à jour de la colonne Valeur sont dans l’événement CellPainting du DGV, d'où mon insistance à déclencher le refresh du DGV.

    Après, je me rends compte que ces calculs dans cet événement ce n'est peut-être pas le top, mais quand j'ai créé le DGV ça me paraissait logique (allez savoir pourquoi).

    En désespoir de cause, je vais finir par déplacer mes calculs dans une sub à part que je vais déclencher dans le CellPainting et le Sub "DataGridViewSuiviVariables_SelectedIndexChanged" avec un peu de databinding sure le DGV, ça va peut-être tout me mettre à jour.

    Mais ce que je ne comprends pas c'est pourquoi le refresh là où je l'ai mis ne déclenche pas le cellPainting, il me semble bien que sur d'autres écrans de mon appli, ça marche?
    Ce n'est pas parce que l'on allume la bougie de quelqu'un avec sa lanterne que l'on se prive de lumière.

  4. #4
    Membre du Club Avatar de sibama
    Profil pro
    Inscrit en
    Août 2008
    Messages
    147
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 147
    Points : 55
    Points
    55
    Par défaut
    Bonjour à ceux qui me liront,

    En fait j'ai trouvé une solution qui fonctionne:

    - Tout d'abord j'ai un peu repris mon code pour que le contenu de la combobox face partie des données de la bindingsource de mon DGV, bon ça c'est ma sauce interne.

    - Par contre, ce que je me suis rendu compte, c'est que quand je passe dans la Private Sub DataGridViewSuiviVariables_SelectedIndexChanged (voir mon post d'origine), "combo" contient bien la valeur que je viens de sélectionner via la combobox de la ligne du DGV, mais "cell" n'est mis à jour que si on passe 2 fois dans la sub.
    J'ai donc modifié le code comme suit, et ça marche nickel
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
       Private Sub DataGridViewSuiviVariables_SelectedIndexChanged(sender As Object, e As EventArgs)
            Dim combo = TryCast(sender, DataGridViewComboBoxEditingControl)
     
            MesDonnees(combo.EditingControlDataGridView.CurrentCell.RowIndex).FormatValeur = combo.Text
            Me.DataGridViewSuiviVariables.Refresh()
     
        End Sub
    En espérant que cette petite galère et la solution trouvée pourront un jour servir à quelqu'un.
    Ce n'est pas parce que l'on allume la bougie de quelqu'un avec sa lanterne que l'on se prive de lumière.

  5. #5
    Modérateur
    Avatar de Sankasssss
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 842
    Points : 4 232
    Points
    4 232
    Par défaut
    Désolé de t'avoir laissé en plan. J'avais commencé une réponse mais j'ai eu un problème de VPN et j'ai complètement zappé après.

    Dans ma réponse je te disais d'aller voir du coté de RefreshEdit() :
    Citation Envoyé par MSDN
    Refreshes the value of the current cell with the underlying cell value when the cell is in edit mode, discarding any previous value.

  6. #6
    Membre du Club Avatar de sibama
    Profil pro
    Inscrit en
    Août 2008
    Messages
    147
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 147
    Points : 55
    Points
    55
    Par défaut
    Bonjour Sankasssss,

    Merci pour ta réponse, je vois que même les cracs en info ont aussi des problèmes .

    J'ai un truc qui marche, mais je me suis dit, vu que quelqu'un essaye de m'aider, j'essaye ce qui m'est proposé.

    En fait quand je mets du RefreshEdit() dans ma sub DataGridViewSuiviVariables_SelectedIndexChanged, il ne se passe pas grand chose de plus que quand je mets du Refresh (ou alors je m'y prend mal).

    Par contre il se passe un truc que je m'explique mal: si je fais un changement sur ma comboboxcolumn, le code se passe sans erreur. Mais si je clique plusieurs fois sur la comboboxcolumn, j'ai un message d'erreur qui me dit que je suis en train de ré-entrer dans une procédure déjà en cours?....

    J'ai déjà eu ce problème hier car j'ai essayé de mettre un select() d'une autre colonne pour qu'après le changement de ma combobox, je puisse déselectionner complètement la cellule (je n'aime pas quand la cellule reste sélectionnée après une action), et je ne réussi pas à faire de clearselection() sur la cellule de la combobox (l'option est indisponible quelle que soit la manière dont je m'y prends). Et bien j'ai exactement le même comportement : ça marche la première fois et sa plante si on clique plusieurs fois.

    C'est comme si la sub restait active ou est relancée plusieurs fois pendant la mise à jour du reste du code.

    Du coup j'ai laissé tombé le coté désélection, des fois je ravale ma fierté et je revois mes ambitions à la baisse quand ça devient trop compliqué.

    Si tu as une explication, je suis preneur, sinon ne te prends pas la tête avec ça, j'ai quand même un truc qui fait globalement ce que je veux.

    Encore merci à toi pour le temps passé pour m'aider.
    Ce n'est pas parce que l'on allume la bougie de quelqu'un avec sa lanterne que l'on se prive de lumière.

  7. #7
    Modérateur
    Avatar de Sankasssss
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 842
    Points : 4 232
    Points
    4 232
    Par défaut
    C'est trop compliqué de comprendre le pourquoi du plantage sans avoir le code qui tourne derrière car on en sait pas comment est faite la liaison de données (DataSet, Collection, remplissage manuel?) et bien d'autres choses.
    Pour tester le comportement le mieux serait de refaire un projet simplifié avec un DataGridView alimenté de la même manière qui contiendrait quelques lignes et qui reproduirait l'erreur. Ca se fait encore assez vite mais faut avoir l'envie d'approfondir. Si l'envie te prend, n'hésite pas à poster le code.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 06/12/2007, 11h09
  2. Lancement d'une macro après mise à jour d'une cellule
    Par Mukade dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 17/10/2007, 11h52
  3. [AJAX] Mise à jour d'une page après réception d'une requête
    Par M.Dlb dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 11/11/2006, 15h48
  4. Mise à jour d'une zone de liste modifiable
    Par Dwain dans le forum Access
    Réponses: 11
    Dernier message: 25/09/2006, 23h35
  5. Mise à jour d'une table sans avoir la table
    Par Cablan dans le forum Access
    Réponses: 9
    Dernier message: 26/12/2005, 11h24

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