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