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 :

Problème avec un DataGridView


Sujet :

Windows Forms

  1. #1
    Membre régulier
    Profil pro
    gnome
    Inscrit en
    Octobre 2004
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : El Salvador

    Informations professionnelles :
    Activité : gnome

    Informations forums :
    Inscription : Octobre 2004
    Messages : 142
    Points : 71
    Points
    71
    Par défaut Problème avec un DataGridView
    Bonjour,

    Après plusieurs jours de galère je fais appel à vous pour m'aider à identifier un bug.

    Je ne suis pas développeurs VB.net (plutôt Java) mais je reprends l'application VB.net écrite par une tierce personne. Je suis sous XP SP3 et VS 2008.

    Je ne m'en sors pas trop mal, mis à part un bug, visiblement lié à un DataGrifdView (DGV), que je n'arrive par à corriger. Voici la situation :

    La Solution est composée de plusieurs modules :
    - un module container affichant une arborescence donnant accès à des formulaires de saisie + un espace vide où prennent place les formulaires
    - chaque formulaire est un projet de la solution (une DLL)
    - En cliquant dans l'arborescence on ouvre une DLL et le form correspondant

    Les formulaires insèrent les données dans une base Access via des DataSets, DataTable, DataGridView... Je ne suis pas très à l'aise avec cette terminologie Microsoft.

    Su l'un des formulaires il y a deux instances d'un DGV (mais le problème se produit aussi si j'en retire un des deux).

    A l'exécution le problème se manifeste uniquement si l'on a cliqué sur la dernière ligne de l'un des deux DGV (comme pour créer une nouvelle ligne), sans la remplir, si on laisse le curseur dans la ligne (vide) et qu'on ferme le formulaire.

    Concrètement cela lève une exception non gérée, qui est déclenchée APRES l’événement FormClosing, et que je n'arrive pas à isoler. Voici sa trace (le DGV pris en exemple porte le nom CAPT_ELEM_DGV):

    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
     
    L'exception System.ArgumentOutOfRangeException n'a pas été gérée
      Message="L'index était hors limites. Il ne doit pas être négatif et doit être inférieur à la taille de la collection.\r\nNom du paramètre*: index"
      Source="mscorlib"
      ParamName="index"
      StackTrace:
           à System.Collections.ArrayList.get_Item(Int32 index)
           à System.Windows.Forms.DataGridViewColumnCollection.get_Item(Int32 index)
           à System.Windows.Forms.DataGridView.PositionEditingControl(Boolean setLocation, Boolean setSize, Boolean setFocus)
           à System.Windows.Forms.DataGridView.PerformLayoutPrivate(Boolean useRowShortcut, Boolean computeVisibleRows, Boolean invalidInAdjustFillingColumns, Boolean repositionEditingControl)
           à System.Windows.Forms.DataGridView.ResetUIState(Boolean useRowShortcut, Boolean computeVisibleRows)
           à System.Windows.Forms.DataGridViewRowCollection.OnCollectionChanged_PreNotification(CollectionChangeAction cca, Int32 rowIndex, Int32 rowCount, DataGridViewRow& dataGridViewRow, Boolean changeIsInsertion)
           à System.Windows.Forms.DataGridViewRowCollection.OnCollectionChanged(CollectionChangeEventArgs e, Int32 rowIndex, Int32 rowCount, Boolean changeIsDeletion, Boolean changeIsInsertion, Boolean recreateNewRow, Point newCurrentCell)
           à System.Windows.Forms.DataGridViewRowCollection.ClearInternal(Boolean recreateNewRow)
           à System.Windows.Forms.DataGridView.OnClearingColumns()
           à System.Windows.Forms.DataGridViewColumnCollection.Clear()
           à System.Windows.Forms.DataGridView.Dispose(Boolean disposing)
           à Saisie_Act.DGVTabCr.Dispose(Boolean disposing) dans C:\Documents and Settings\Pascal\Mes documents\Visual Studio 2008\AVDTH\avdth2010\Saisie_Act\DGVTabCr.Designer.vb:ligne 32
           à System.ComponentModel.Component.Dispose()
           à System.ComponentModel.Container.Dispose(Boolean disposing)
           à System.ComponentModel.Container.Dispose()
           à Saisie_Act.F_Act_Maj.Dispose(Boolean disposing) dans C:\Documents and Settings\Pascal\Mes documents\Visual Studio 2008\AVDTH\avdth2010\Saisie_Act\F_Act_Maj.Designer.vb:ligne 10
           à System.ComponentModel.Component.Dispose()
           à System.Windows.Forms.Form.WmClose(Message& m)
           à System.Windows.Forms.Form.WndProc(Message& m)
           à System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
           à System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
           à System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
           à System.Windows.Forms.UnsafeNativeMethods.DefMDIChildProc(IntPtr hWnd, Int32 msg, IntPtr wParam, IntPtr lParam)
           à System.Windows.Forms.Form.DefWndProc(Message& m)
           à System.Windows.Forms.Control.WndProc(Message& m)
           à System.Windows.Forms.ScrollableControl.WndProc(Message& m)
           à System.Windows.Forms.ContainerControl.WndProc(Message& m)
           à System.Windows.Forms.Form.WmSysCommand(Message& m)
           à System.Windows.Forms.Form.WndProc(Message& m)
           à System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
           à System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
           à System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
           à System.Windows.Forms.UnsafeNativeMethods.DefMDIChildProc(IntPtr hWnd, Int32 msg, IntPtr wParam, IntPtr lParam)
           à System.Windows.Forms.Form.DefWndProc(Message& m)
           à System.Windows.Forms.Control.WndProc(Message& m)
           à System.Windows.Forms.ScrollableControl.WndProc(Message& m)
           à System.Windows.Forms.ContainerControl.WndProc(Message& m)
           à System.Windows.Forms.Form.WmNcButtonDown(Message& m)
           à System.Windows.Forms.Form.WndProc(Message& m)
           à System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
           à System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
           à System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
           à System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
           à System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData)
           à System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
           à System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
           à System.Windows.Forms.Application.Run(ApplicationContext context)
           à Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.OnRun()
           à Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.DoApplicationModel()
           à Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.Run(String[] commandLine)
           à Avdth2010.My.MyApplication.Main(String[] Args) dans 17d14f5c-a337-4978-8281-53493378c1071.vb:ligne 81
           à System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
           à System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
           à Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
           à System.Threading.ThreadHelper.ThreadStart_Context(Object state)
           à System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
           à System.Threading.ThreadHelper.ThreadStart()
      InnerException:
    J'ai juste réussi à relier ce problème avec l'existance de cette portion de code (événement RowStateChanged dudit DGV) :

    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
     
    Private Sub CAPT_ELEM_DGV_RowStateChanged(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewRowStateChangedEventArgs) Handles CAPT_ELEM_DGV.RowStateChanged
            ' Si l'utilisateur sélectionne une ligne entière, on stoppe le mode d'édition des cellules automatique.
            ' Sinon, on réactive le mode d'édition automatique.
            ' Cela permet à l'utilisateur de pouvoir supprimer la/les lignes entières d'un coup.
     
            If e.Row.Selected Then
                If Utile.Restrict_Selection_DGV(CAPT_ELEM_DGV) Then
                    CAPT_ELEM_DGV.EditMode = DataGridViewEditMode.EditProgrammatically
                    CAPT_ELEM_DGV.EndEdit()
                End If
            Else : CAPT_ELEM_DGV.EditMode = DataGridViewEditMode.EditOnEnter
            End If
     
        End Sub
    Si je retire le code ce la méthode le problème disparaît, mais la saisie dans le DGV ne se comporte plus comme souhaité (on ne peut plus taper de texte au clavier dans les cellules).


    Sauriez-vous m'aider, me donner des indices... m'expliquer aussi le but du code dans RowStateChanged ?
    Sinon que puis-je fournir comme infos complémentaires ?

    D'avance merci de votre aide précieuse.

    Cordialement

  2. #2
    Membre régulier
    Profil pro
    gnome
    Inscrit en
    Octobre 2004
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : El Salvador

    Informations professionnelles :
    Activité : gnome

    Informations forums :
    Inscription : Octobre 2004
    Messages : 142
    Points : 71
    Points
    71
    Par défaut
    Ca se produit après FormClosed même...

    Y-a-t-il d'autres événements appelés après celui-ci, où je devrais mettre des points d'arrêt ?

  3. #3
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Apparement, le Dispose du DataGridView produit l'exception (bug du framework?).

    J'essaierai de gérer l'event Disposed du DataGridView et je mettrai dans le code de cet event :
    - soit la désactivation de l'event RowStateChanged,
    - soit modifier la CurrentCell (MyDataGridView.CurrentCell=MyDataGridView.Rows[0].Cells[0])
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  4. #4
    Membre régulier
    Profil pro
    gnome
    Inscrit en
    Octobre 2004
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : El Salvador

    Informations professionnelles :
    Activité : gnome

    Informations forums :
    Inscription : Octobre 2004
    Messages : 142
    Points : 71
    Points
    71
    Par défaut
    Pour faire court, tes indices m'ont permis de solutionner ce problème. Ouf, et merci. Ceci dit ça relève plus du contournement que de la véritable réponse à l'énigme.

    Détails
    --------

    L'exception se produit avant l'event Disposed. Donc tout code en son sein est sans effet..

    Du coup j'ai appliqué tes 2 propositions en fin de l'event FormClosing du form conteneur (l'exception se produit après).

    Là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    RemoveHandler CAPT_ELEM_DGV.RowStateChanged, AddressOf CAPT_ELEM_DGV_RowStateChanged
    est sans effet
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CAPT_ELEM_DGV.CurrentCell = CAPT_ELEM_DGV.Rows(0).Cells(0)
    évite le bug

    Pourquoi, je ne sais pas.
    Le même DGV sur d'autres formulaires similaires fonctionne sans soucis.
    Mais ça me permet de passer à autre chose.

    Merci.

  5. #5
    Membre régulier
    Profil pro
    gnome
    Inscrit en
    Octobre 2004
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : El Salvador

    Informations professionnelles :
    Activité : gnome

    Informations forums :
    Inscription : Octobre 2004
    Messages : 142
    Points : 71
    Points
    71
    Par défaut
    Et bien ce contournement fonctionne pour le premier DVG, mais pas pour l'autre !

    Difficile d'y voir clair.

    Sinon la simple perte du focus par xxx.Focus sur un autre élément du form semble fonctionner aussi.

    A surveiller...

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

Discussions similaires

  1. [C#]Héritage d'un DataGridView, problème avec le designer
    Par Pilloutou dans le forum Windows Forms
    Réponses: 18
    Dernier message: 29/02/2012, 08h21
  2. Problème avec le datagridview (évènements)
    Par jacko842 dans le forum VB.NET
    Réponses: 3
    Dernier message: 16/05/2010, 19h47
  3. Réponses: 7
    Dernier message: 11/05/2010, 10h17
  4. Réponses: 1
    Dernier message: 28/02/2007, 09h16
  5. Réponses: 1
    Dernier message: 24/01/2007, 16h00

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