Bonjour à tous,
J'ai plusieurs petits problèmes avec mon programme que je n'arrive pas du tout à résoudre malgré tout mes efforts. Je pense que ces problèmes sont fortement liés entre eux.
Donc voilà, J'utilise une DataTable pour stocker des taches, (chaque ligne représentant une tache). Je fait un 1er calcul sur ces taches dés qu'une valeur change dans l’évènement ColumnChanged pour calculer par exemple si la tache est en retard ou terminé....etc. Ensuite je fait un 2eme calcul pour comptabiliser le nombre de tache terminé. (J'ai un contrôle CheckBoxTERMINE Bindé directement avec la table). Le mieux est que je vous montre le bout de code suivant :

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
Private Sub TableTachesColumnChanged(sender As System.Object, e As System.Data.DataColumnChangeEventArgs)
        Dim ColonneName As String = e.Column.ColumnName
        Dim ValeurProposed As Object = e.ProposedValue
Call CalculLaLigne(e.Row, "ColumnChanged", ColonneName, ValeurProposed)
BindingSourceTaches.EndEdit()
Call CalculLeNombreDeTacheTerminé
End Sub
 
    Private Sub CalculLaLigne(ByVal Row As DataRow, ByVal EventSource As String, Optional ByVal ColonneName As String = Nothing, Optional ByVal ValeurProposed As Object = Nothing)
' Cette procédure fait une lecture de la valeur Proposed ainsi que toutes les valeurs des autres colonnes. Elle peut retourner des résultats dans le DataRow ou décider de faire une annulation avec CancelEdit
......
If CalculDoitêtreAnnulé = True then Row.CancelEdit
End Sub
 
Private Sub Call CalculLeNombreDeTacheTerminé
        Dim Table As DataTable = dtTableTaches
        Dim expression As String
        Dim sortOrder As String
        Dim foundrows() As DataRow
 
        expression = TableTaches.TERMINE & "='True'"
        sortOrder = TableTaches.ID_TACHE & " ASC"
        foundrows = Table.Select(expression, sortOrder)
        NbTachesTerminé = foundrows.Count
End Sub
Problème 1
Hypothése de calcul initial : j'ai 3 taches Terminé sur 4 taches au total.
Avec la ligne BindingSourceTaches.EndEdit() présente dans le code :
-> Je décoche le Statut Terminé, j'obtiens NbTachesTerminé = 2. Ensuite si j'éxecute le code BindingSourceTaches.Current ("TERMINE") = True , j'obtiens NbTachesTerminé = 2
Sans la ligne BindingSourceTaches.EndEdit() présente dans le code : (Toujours en partant de l'état initial)
-> je décoche le Statut Terminé, j'obtiens NbTacheTerminé = 3

Problème 2 et 3 :
Hypothèse de calcul : MaProcédure CalculLaLigne doit décider d'invalider la modification TERMINE = True en exécutant CancelEdit.
Donc je coche Terminé=True, CancelEdit s’exécute bien , les données dans la table on bien été annulé (TERMINE=False) mais mon contrôle (CheckBoxTERMINE) n'est pas rafraîchi malgré le Binding. Il se comporte comme si il gardait le Statut True, résultat : quand je change de ligne du DataGridView la procédure CalculLaLigne s'exécute à nouveau .
J'aimerais que la procédure ne s'exécute qu'une seul fois (Problème 2).
J'aimerais aussi que mon contrôle soit raffraichi après l’annulation (problème 3).
Pour le probléme 3 : J'ai essayé BindingSourceTaches.CurrencyManager.Refresh() dans l’évènement LostFocus du CheckBoxTERMINE mais c'est pas très propre. (cela modifie la sélection de la cellule sur le DataGridView, j'aimerais plutôt agir sur le Binding du contrôle ChekBoxTERMINE (pour autant que cela soit la solution) mais je ne sais pas faire.

Voilà, ca fait beaucoup d'un coup mais comme je disais je pense que tout les problèmes sont liées et ça fait trés longtemps que je tourne autour de ces problèmes sans trouver de solution.

J'ai peu d'espoir d'arriver à trouver une solution qui règle tout (il faudrait que vous puissiez reproduire mon code ce qui n'est pas simple vu la taille du programme, sinon je suis prêt à donner mon programme source si quelqu'un veux bien regarder) C'est l'unique et dernier problème dans mon programme que j'ai gardé pour la fin voyant que je n'y arrivais pas et j'espère vraiment que vous pourrez m'aider.