Arpès de longues heures à coder, j'arrive à peu près à faire ce que je voulais au départ : insérer ligne après ligne, le détail d'un "contrat" à partir de contrôles WinForm.
Mais j'ai d'autres soucis maintenant :p
Mon DataGrid qui prend le DataSet en cache comme source de données possède une colonne avec des boutons pour détruire toutes les lignes comportant la même marque ET le même modèle que ceux de la ligne du bouton. Sauf que, je vous arrête de suite, il ne s'agit pas de détruire les lignes du DataGrid, mais bien du DataTable auquel il est relié ( et ensuite de rebinder le DataGrid avec le DataTable ).
A priori, rien de sorcier. Mais ça ne marche pas. Je n'ai aucun résultat réel affiché après l'action. Lorsque je clique sur le bouton d'une ligne du DataGrid, je vois bien qu'il recharge la page, mais rien ne change.
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 // handler pour réaliser la suppression lors du clic sur le bouton d'une des lignes protected void DG_NvlPMS1_ItemCommand(object sender, DataGridCommandEventArgs e) { // récupération du DataTable en cache pour le traiter DTNvlPMS = (DataTable) Cache["Accord"]; // parcours du DataTable à la recherche des lignes ayant // même marque et modèle que ceux de la ligne du // bouton appuyé dans le DataGrid. foreach( DataRow myRow in DTNvlPMS.Rows ) { if ( myRow["Marque"] == e.Item.Cells[0].ToString() && myRow["Modele"] == e.Item.Cells[1].ToString() ) { DTNvlPMS.Rows.Remove(myRow); } } // Je vide la variable du cache et je la relie au nouveau tableau Cache.Remove("Accord"); Cache.Insert("Accord",DTNvlPMS); // je rebind mon DataGrid avec le DataTable DG_NvlPMS1.DataSource = (DataTable)Cache["Accord"]; DG_NvlPMS1.DataBind(); }
Pour info, j'ai bien vérifier le OnItemCommand="DG_NvlPMS1_ItemCommand" dans la définition du DataGrid.
C'est désespérant.
De plus, j'ai un soucis presque identique. Lorsque j'insère une donnée dans mon DataTable du cache, j'aimerais contrôler qu'il n'existe pas déjà une ligne avec cette marque et ce modèle, auquel cas, je ne ferais qu'une MAJ de la ligne et non pas une nouvelle insertion.
Et bien, devinez quoi ? ça ne marche pas. Le code a l'air bon, il compile, mais il m'ajoute toujours une ligne et ne mets pas à jour pour une même marque et un même modèle.
Alors, je sais qu'il y a un soucis avec le break, puisqu'il fait quitter du if et non pas du foreach. Mais même dans ce cas, il devrait mettre à jour la ligne concernée, et insérer encore cette ligne à la fin. Or, il ne fait même pas cette MAJ.
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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95 protected DataTable setDT() { DataTable DTtmp = new DataTable(); DataColumn DC1 = new DataColumn(); DC1.ColumnName = "Marque"; DTtmp.Columns.Add(DC1); DataColumn DC2 = new DataColumn(); DC2.ColumnName = "Modele"; DTtmp.Columns.Add(DC2); DataColumn DC3 = new DataColumn(); DC3.ColumnName = "Quantite"; DTtmp.Columns.Add(DC3); return(DTtmp); } protected DataTable insDT ( DataTable DT, string marque, string modele, string quantite ) { // on dit par défaut que c'est un nouvel enregistrement bool newrow = true; // on vérifie qu'il n'y a pas de lignes ayant // même marque et modèle, sinon MAJ. foreach( DataRow myRow in DT.Rows ){ if ( myRow["Marque"] == marque && myRow["Modele"] == modele ) { myRow["Quantite"] = quantite; newrow = false; break; } else { newrow = true; } } // Si c'est une nouvelle ligne, on l'insère if ( newrow ) { DataRow myDR = DT.NewRow(); myDR["Marque"] = marque; myDR["Modele"] = modele; myDR["Quantite"] = quantite; DT.Rows.Add(myDR); } return (DT); } protected void B_NvlPMS1_Click(object sender, EventArgs e) { // initialisation de mon DataTable dont je me sers // pour les traitements DTNvlPMS = setDT(); // S'il existe un DataTable dans mon cache non nul // je le récupère if ( Cache["Accord"] != null ) { DTNvlPMS = (DataTable) Cache["Accord"]; } // j'insère une nouvelle ligne DTNvlPMS = insDT ( DTNvlPMS, LB_NvlPMS1.SelectedValue.ToString(), LB_NvlPMS2.SelectedValue.ToString(), TB_NvlPMS2.Text); // comme précédemment, je MAJ le cache et je rebind // le DataGrid Cache.Remove("Accord"); Cache.Insert("Accord",DTNvlPMS); DG_NvlPMS1.DataSource = (DataTable)Cache["Accord"]; DG_NvlPMS1.DataBind(); Label1.Text = DTNvlPMS.Rows.Count.ToString(); }
Encore une fois, je vous remercie pour le temps que vous accorderez à lire mon fouilli et à me donner une réponse![]()
Partager