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][Datagrid] Impossible de supprimer des lignes


Sujet :

Windows Forms

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 63
    Points : 33
    Points
    33
    Par défaut [Vb.Net][Datagrid] Impossible de supprimer des lignes
    Bonjour,

    Visual Basic 2003
    FrameWork : 1.1
    WinXP Home SP2

    Le contexte :

    J'ai une DataGrid en lecture seule alimentée par une table Access. Un DataAdapter alimente un DataSet, qui lui-même est DataSource de ma grille.

    A chaque sélection de ligne, j'ai une variable iLigneCourante qui reçoit la valeur présente dans CurrentRowIndex de ma grille.

    J'ai un bouton qui me permet de supprimer la ligne sélectionnée. Le code de suppression est le suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dsMonDataSet1.Tables("ma_table").Rows(iLigneCourante).Delete()
    Mon problème :

    Si je supprime les lignes en partant de la dernière, tout va bien. En revanche, si je supprime une ligne qui n'est pas la dernière, la ligne directement après n'est plus supprimable une fois ma ligne supprimée ! Pour exprimer ça dans le cas général : je ne peux plus supprimer une ligne dont la ligne précédente à été supprimée. Ce qui fait qu'à la fin je me retrouve avec une grille qui peut avoir bon nombre de lignes qui refusent d'être supprimées

    Pour pouvoir supprimer ces lignes je suis obligé de valider les modifications avec mon DataAdapter (da.Update(...)). Ceci fait les lignes qui n'étaient plus supprimables redeviennent accessibles à la suppression et le même problème recommence pour toutes les nouvelles lignes supprimées...

    Comment puis-je résoudre ce problème ? Y'aurait-il quelque chose à faire lors de la suppression pour que ma DataGrid ne perde pas les pédales ?

  2. #2
    Membre éprouvé
    Avatar de HULK
    Inscrit en
    Juillet 2003
    Messages
    1 276
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 276
    Points : 1 281
    Points
    1 281
    Par défaut
    moi je le mettrai pas en lecture seule le datagrid

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 63
    Points : 33
    Points
    33
    Par défaut
    Ce style de réponse ne mène pas loin. J'ai besoin de mettre ma grille en lecture seule, c'est un fait, et il n'est pas à remettre en cause...

    ...sauf si tu as une justification pertinente à me fournir qui me ferait revoir mon orientation.

    Pourquoi mettrais-tu le DataGrid en lecture seule ? Quelle serait l'incidence sur son fonctionnement ? Justifie ta réponse !

  4. #4
    Membre éprouvé
    Avatar de HULK
    Inscrit en
    Juillet 2003
    Messages
    1 276
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 276
    Points : 1 281
    Points
    1 281
    Par défaut
    bah si tu veux supprimer des lignes de ton datagrid, il n'a pas à etre en lecture seule

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 63
    Points : 33
    Points
    33
    Par défaut
    Une DataGrid est une représentation visuelle d'un ensemble de données. La suppression est effectuée sur cet ensemble de données (cf la ligne de code de mon premier post) et non sur la DataGrid. Ce qui veut dire que quand je supprime une ligne du DataSet, la grille se met à jour pour refléter cet ensemble de données.

    Le fait d'être en lecture seule ou non sert juste à déterminer si l'on souhaite contrôler l'ensemble de données avec la DataGrid ou pas. Dans mon cas, je ne souhaite pas contrôler mes données par son intermédiaire. Cela n'empêche pas la grille d'être l'exacte représentation de celles-ci.

    Or il semble justement que cette grille, qui est mon intermédiaire pour l'accès à mes données, ne les reflète pas complètement.

    De plus, ta réponse ne tient pas puisque j'arrive à supprimer des lignes. Ce sont les lignes qui se trouvent directement sous celles que j'ai supprimées qui ne sont plus supprimables !

  6. #6
    Membre régulier Avatar de boulete
    Profil pro
    Inscrit en
    Février 2006
    Messages
    132
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Février 2006
    Messages : 132
    Points : 106
    Points
    106
    Par défaut
    Ca doit être un problème d'indexation. IL ne retrouve pas LigneCourante une fois qu'elle a été supprimée ... Tu dois avoir un problème sur ta boucle ...

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 63
    Points : 33
    Points
    33
    Par défaut
    De quelle boucle parles-tu ? Je n'ai aucune boucle : J'ai une ligne qui fait la suppression, et une autre qui met à jour l'index de la ligne sélectionnée pour pouvoir m'adresser à mes enregistrements dans le DataSet...

    Dans le détail et par exemple, je sélectionne la 3ème ligne - index = 2. Je supprime l'enregistrement qui se trouve à l'index = 2. Donc dans la logique des choses, l'enregistrement qui était à l'index = 3 passe à l'index = 2, etc pour les autres enregistrements.

    Je veux maintenant supprimer l'enregistrement qui vient de passer à l'index = 2...impossible. L'enregistrement reste là. En revanche, si je supprime l'enregistrement qui vient de passer en index = 3, ca fonctionne ! Comprends pas !

  8. #8
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 273
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 273
    Points : 2 203
    Points
    2 203
    Par défaut
    C'est normal, tu as du utiliser leso ptions de concurrence d'accès et donc tes lignes sont supprimées virtuellement mais on toujours un "rowstate" ou equivalent.

    Logiquement, tu devrais juste essayer une validation des modifications du dataset à chaque suppression.

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 63
    Points : 33
    Points
    33
    Par défaut
    Si je vais une validation, ça fonctionne (cf premier post). Or, je veux que cela fonctionne sans valider les modifs. Et je ne dérogerai pas à ce souhait. Et il y a forcément un moyen de gérer ça sans avoir besoin de valider sinon le fait de pouvoir valider ou non ne sert à rien !

    Peut-tu m'en dire plus sur les options de concurrence d'accès et les "rowstate" ? C'est peut être de ce côté que je pourrais trouver une solution ?

    Il manque une étape lors de la suppression pour que ma grille soit à jour (sans valider). Laquelle ??

  10. #10
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 273
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 273
    Points : 2 203
    Points
    2 203
    Par défaut
    C'est simple en fait.

    Il y a :
    Ta base (representation physique) et la table / vue /sp ,etc etc.
    Elle contient physiquement les donnees.

    Ton dataset qui contient par exemple une datatable

    Quand tu bin une grid a une datatable d'un dataset,
    celui-ci contient et gére une vue des données de la base.

    En revanche tu peux valider la maj d'une datatable sans mettre à jour la vraie Db. Car en réalité, si tu utilises
    Je crois que dans ton cas comme tu ne commit pas le delete dans la datatable, il te jette sur celui d'après (concurrence)

  11. #11
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 273
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 273
    Points : 2 203
    Points
    2 203
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
            Dim str1 As String
            str1 = ""
            Me.RichTextBox1.Clear()
            Dim i As Integer
            For i = 0 To Me.DataSet11.Asset_Minor_Types.Rows.Count - 1
                Try
                    str1 = str1 + Me.DataSet11.Asset_Minor_Types.Rows(i).Item(0).ToString + "-" + Me.DataSet11.Asset_Minor_Types.Rows(i).RowState.ToString + vbCrLf
                Catch
                    str1 = str1 + "Rows (" + CStr(i) + ") - Deleted" + vbCrLf
                End Try
            Next
     
            Me.RichTextBox1.Text = str1
    Essayes ca avec un richtextbox dans ta form et un petit boutton, ca devrait t'eclairer sur les row state et le reste.

    Reste que pour moi tu devrais faire un accept change si tu supprimes des enregistrements indexes automatiquement avant d'en rajouter.

  12. #12
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 63
    Points : 33
    Points
    33
    Par défaut
    Et bien voilà ! Merci pour cette solution !

    En fait, nous nous étions mal compris quant à la validation des modifications. Pour moi, je parlais de la validation finale en base :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    daAdapter.Update(dsDataSet, MA_TABLE)
    Le AcceptChanges() est une validation intermédiaire que je ne faisais effectivement pas. Je l'avais déjà utilisé au début de mon apprentissage et je l'avais laissé tombé.

    Ah oui, je me souviens pourquoi je ne l'utilisais plus : le AcceptChanges() remet à False le résultat de HasChanges(). Or j'ai une fonction qui est appelée sur la fermeture de la fenêtre pour vérifier si les modifications ont été enregistrées et donc proposer à l'utilisateur de sauvegarder ou d'annuler ses modifs avant de fermer la fenêtre.

    Dans cette vérification je teste s'il y a eu des changements avec justement HasChanges(). Sauf qu'en acceptant les suppressions avec AcceptChanges(), ma vérification ne fonctionne plus...Et la fermeture se fait, sans proposer l'enregistrement des modifs .

    Je vais donc devoir me coller un flag indépendant pour gérer ça. Cela n'est pas bien grave, j'ai quand même la solution à un problème plus important !

    Merci encore, cela m'enlève une épine du pied et va me permettre d'avancer !

  13. #13
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 63
    Points : 33
    Points
    33
    Par défaut
    Une question me vient tout de même à l'esprit (pour ma culture générale ) :

    La suppression s'est mise à ne plus fonctionner correctement dès lors que j'ai fait une jointure sur deux tables dans la requête de mon DataAdapter. C'est-à-dire que d'après ce qui m'est arrivé, quand mon DataAdapter dépend d'une requête sur une table je n'ai pas besoin de faire un AcceptChanges(), tout fonctionne ; alors que quand mon DataAdapter dépend d'une requête avec jointure, je dois faire un AcceptChanges() pour que cela fonctionne. Pourquoi ?

  14. #14
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 273
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 273
    Points : 2 203
    Points
    2 203
    Par défaut
    Probablement a cause des contraintes d'integrité referentielle qui régissent tes tables.

    (Update and delete cascade,etc,etc...)

    Qd aux modifications, il te suffit ...

    1 - De faire une copie de ton dataset avant modif (voir avec persistance locale en XML

    2 - Créer un version avec piste d'audit (j'entends a la main de ton dataset, avec qui date et quoi : insert, 12H00, value1,Value2)
    Et permettre un retour sur ces données là (très similaire au principe de log.)

    3 - Utiliser le getchanges qui permet d'avoir une copie du dataset avant le dernier acceptchange (ton cas prècis donc)

  15. #15
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 273
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 273
    Points : 2 203
    Points
    2 203
    Par défaut
    Et autre conseil, à priori si tu dois baser ta vue sur plusieurs données, tu ferais mieux :

    D'utiliser des datasets avec des relations entre les tables
    Des proc stocks sur la DB

    Le fait que ta méthode te poses des problèmes me surprend à moitié...
    Et surtout, tu ne maitrise pas du tout la transaction (enfin si, mais tu te reposes trop sur ODBC...)

  16. #16
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 63
    Points : 33
    Points
    33
    Par défaut
    Citation Envoyé par B.AF
    Et surtout, tu ne maitrise pas du tout la transaction (enfin si, mais tu te reposes trop sur ODBC...)
    S'il n'y avait que ça que je ne maitrisais pas du tout...

    Citation Envoyé par B.AF
    Créer un version avec piste d'audit
    Tu vas trop loin pour moi ! Je suis débutant en Vb.Net et mon apprentissage est plutôt laborieux...

    J'essaie d'aller vite, pour atteindre le plus rapidement mon objectif. J'ai une obligation de résultat (un client que je dois livrer) et le porte monnaie aura raison sur la qualité du développement. Je préfèrerais avoir un développement le plus propre possible, mais cette recherche de "perfection" à un coût. Si je peux, je ferais évoluer mon soft grâce à de nouvelles versions, et donc je l'améliorerai, mais pour l'instant, il faut vivre !

    Merci pour tout ! J'arrive à mes fins, même si cela n'est peut être pas parfait !

  17. #17
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 273
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 273
    Points : 2 203
    Points
    2 203
    Par défaut
    C'est pas du .NET, c'est trouver des solutions.

    Heureusement ou malheureusement, /NET ne fait pas tout tout seul.

    Les choix sont multiples pour répondre à une problématique.

    Le meilleur outil d'un developpeur avant l'IDE, c'est une feuille et un crayon pour representer ce qu'il va faire.

    Mais là, c'est un autre sujet.

  18. #18
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 63
    Points : 33
    Points
    33
    Par défaut
    S'il ne s'agissait que d'une feuille et d'un crayon, j'aurais fini depuis longtemps...

  19. #19
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 273
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 273
    Points : 2 203
    Points
    2 203
    Par défaut
    bon courage alors !

  20. #20
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 63
    Points : 33
    Points
    33
    Par défaut
    Merci !

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

Discussions similaires

  1. Impossible de supprimer des lignes
    Par decksroy dans le forum Forms
    Réponses: 4
    Dernier message: 26/08/2008, 17h46
  2. Réponses: 5
    Dernier message: 11/08/2008, 15h25
  3. impossible de supprimer des lignes du DataGridview
    Par patsolaar dans le forum Accès aux données
    Réponses: 3
    Dernier message: 25/04/2008, 11h58
  4. [VB.NET] Datagrid : Modifier les headers des colones
    Par burnedsoul dans le forum VB.NET
    Réponses: 9
    Dernier message: 05/11/2005, 11h29
  5. Shell pour supprimer des lignes d'un fichier
    Par nelsa dans le forum Autres langages
    Réponses: 2
    Dernier message: 20/09/2004, 12h26

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