Problème résolu ! Voir la solution.
Bonsoir !
Je galère depuis plus de deux heures sur un problème que je ne comprends absolument pas.
Je suis en train de créer un petit logiciel en C# avec Visual Studio pour ma mère.
Dans ce logiciel, il y à un DataGrid (qui contient la liste des cabanes), un Button pour sauvegarder (j'en parlerais un peu plus loin), ainsi qu'un Button pour ouvrir la cabane. Ce dernier se trouve à la fin de chaque lignes du DataGrid.
Voici une petite capture du logiciel (ne faite pas attention au nom de la cabane ) :
Lorsque j'ouvre une cabane via le dossier bleu (c'est un Button), j'ai une autre fenêtre qui s'ouvre avec toutes les informations sur celle-ci.
Tout ça (l'ouverture de la cabane, la sauvegarde, le chargement, …) fonctionne très bien. Cependant, là ou ça coince, c'est quand je modifie le nom d'une cabane, que je sauvegarde et que j'essaye de l'ouvrir.
Lorsque j'ouvre (après avoir sauvegardé) une cabane dont je viens de modifier le nom, tout plante !
J'ai le message suivant (que j'ai défini dans mon code) :
Ainsi que celui-ci :
J'ai vérifier, et le fichier Datas/Cabanes/xxxcccjjjhhhdghdgfgfgfgfgfgfgf.drisgdat
existe bien. Et il est créer avant d'ouvrir la fenêtre puisque je sauvegarde avant.
Voici mon code :
MainWindow.xaml.cs :
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 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 | using System; using System.Collections.Generic; using System.IO; using System.Threading; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; namespace Sopego_Cabanes { public partial class MainWindow : Window { private List<CabaneClass> cabanesList = new List<CabaneClass>(); private bool datasSaved = true; private String cellOldValue; public MainWindow() { //System.Threading.Thread.Sleep(3000); InitializeComponent(); // Chargement de la liste des cabanes LoadCabanesDatas(); // Mise à jour du widget de la liste des cabanes UpdateCabanesWidget(); } public void LoadCabanesDatas() { try { StreamReader fileReader = new StreamReader("Datas/Cabanes.drisgdat"); String line; int nextId = 0; cabanesList.Clear(); while ((line = fileReader.ReadLine()) != null) { String[] datas = line.Split('§'); nextId++; cabanesList.Add(new CabaneClass() { Id = nextId, Name = datas[0] }); } fileReader.Close(); } catch (Exception ex) { MessageBox.Show("Le fichier 'Datas/Cabanes.drisgdat' est introuvable. (Code 1)", "Erreur", MessageBoxButton.OK, MessageBoxImage.Error); Console.WriteLine(ex.Message); Close(); } } public void UpdateCabanesWidget() { cabanesGrid.ItemsSource = null; cabanesGrid.ItemsSource = cabanesList; } private async void SaveDatas() { try { savingPanel.Visibility = Visibility.Visible; savingLabel.Visibility = Visibility.Visible; // On enregistre la liste des cabanes StreamWriter fileWriter = new StreamWriter("Datas/Cabanes.drisgdat"); foreach (CabaneClass cabane in cabanesList) { String newLine = cabane.Name + "§"; newLine = newLine.Remove(newLine.Length - 1, 1); fileWriter.WriteLine(newLine); } fileWriter.Close(); // On créer un fichier pour chaque cabanes foreach (CabaneClass cabane in cabanesList) { if (!File.Exists("Datas/Cabanes/" + cabane.Name + ".drisgdat")) { File.CreateText("Datas/Cabanes/" + cabane.Name + ".drisgdat"); } } //MessageBox.Show("Données sauvegardées !", "Information", MessageBoxButton.OK, MessageBoxImage.Information); await Task.Delay(2000); savingPanel.Visibility = Visibility.Hidden; savingLabel.Visibility = Visibility.Hidden; } catch (Exception ex) { MessageBox.Show("Le fichier 'Datas/Cabanes.drisgdat' est introuvable. Données non sauvegardées. (Code 2)", "Erreur", MessageBoxButton.OK, MessageBoxImage.Error); Console.WriteLine(ex.Message); } datasSaved = true; } private void Save_Click(object sender, RoutedEventArgs e) { SaveDatas(); } private void Add_Click(object sender, RoutedEventArgs e) { cabanesList.Add(new CabaneClass() { Id = cabanesList.Count + 1, Name = "" }); UpdateCabanesWidget(); datasSaved = false; } private void Remove_Click(object sender, RoutedEventArgs e) { MessageBoxResult result = MessageBox.Show("Voulez-vous supprimer cette ligne ?", "Demande de confirmation", MessageBoxButton.YesNo, MessageBoxImage.Exclamation); if (result == MessageBoxResult.Yes) { CabaneClass cabaneToRemove = (CabaneClass)((Button)sender).DataContext; bool lineRemoved = false; for (int i = 0; i < cabanesList.Count; i++) { if (cabanesList[i].Id == cabaneToRemove.Id && cabanesList[i].Name == cabaneToRemove.Name) { cabanesList.RemoveAt(i); UpdateCabanesWidget(); lineRemoved = true; break; } } if (!lineRemoved) { MessageBox.Show("Une erreur est survenue. La ligne n'a pas été supprimé. (Code 3)", "Erreur", MessageBoxButton.OK, MessageBoxImage.Error); } } datasSaved = false; } private void Open_Click(object sender, RoutedEventArgs e) { if (datasSaved) { CabaneClass selectedCabane = (CabaneClass)(((FrameworkElement)sender).DataContext); CabaneWindow cabaneWindow = new CabaneWindow(selectedCabane.Name); cabaneWindow.ShowDialog(); } else { MessageBoxResult result = MessageBox.Show("Vous devez sauvegarder vos données avant de continuer.\nVoulez-vous sauvegarder ?", "Demande de confirmation", MessageBoxButton.YesNo, MessageBoxImage.Information); if (result == MessageBoxResult.Yes) { SaveDatas(); } } } private void Quit_Click(object sender, RoutedEventArgs e) { if (datasSaved) { Close(); } else { MessageBoxResult result = MessageBox.Show("Vos données ne sont pas sauvegarder. Voulez-vous sauvegarder avant de fermer l'application ?", "Demande de confirmation", MessageBoxButton.YesNo, MessageBoxImage.Exclamation); if (result == MessageBoxResult.Yes) { SaveDatas(); } Close(); } } private void Quit_Click(object sender, System.ComponentModel.CancelEventArgs e) { if (!datasSaved) { MessageBoxResult result = MessageBox.Show("Vos données ne sont pas sauvegarder. Voulez-vous sauvegarder avant de fermer l'application ?", "Demande de confirmation", MessageBoxButton.YesNo, MessageBoxImage.Exclamation); if (result == MessageBoxResult.Yes) { SaveDatas(); } } } private void Cell_EditEnding(object sender, DataGridCellEditEndingEventArgs e) { datasSaved = false; } } public class CabaneClass { public int Id { get; set; } public String Name { get; set; } } } |
CabaneWindow.xaml.cs :
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 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 | using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Shapes; namespace Sopego_Cabanes { /// <summary> /// Interaction logic for CabaneWindow.xaml /// </summary> public partial class CabaneWindow : Window { private String selectedCabaneName; private List<CabaneDataClass> cabanesDatasList = new List<CabaneDataClass>(); private bool datasSaved = true; public CabaneWindow(String mName) { InitializeComponent(); selectedCabaneName = mName; window.Title = mName; // Chargement de la liste des cabanes LoadDatas(); // Mise à jour du widget de la liste des cabanes UpdateDatasWidget(); } private void LoadDatas() { try { StreamReader fileReader = new StreamReader("Datas/Cabanes/"+selectedCabaneName+".drisgdat"); String line; int nextId = 0; cabanesDatasList.Clear(); while ((line = fileReader.ReadLine()) != null) { String[] datas = line.Split('§'); nextId++; if (datas.Length >= 3) { cabanesDatasList.Add(new CabaneDataClass() { Id = nextId, MDate = (datas[0].Equals("")) ? "" : DateTime.Parse(datas[0]).Day + "/" + DateTime.Parse(datas[0]).Month + "/" + DateTime.Parse(datas[0]).Year, NomChantier = datas[1], MDateRetour = (datas[2].Equals("")) ? "" : DateTime.Parse(datas[2]).Day + "/" + DateTime.Parse(datas[2]).Month + "/" + DateTime.Parse(datas[2]).Year, }); } } fileReader.Close(); } catch (Exception ex) { MessageBox.Show("Le fichier 'Datas/Cabanes/" + selectedCabaneName + ".drisgdat' est introuvable. (Code 4)", "Erreur", MessageBoxButton.OK, MessageBoxImage.Error); Console.WriteLine(ex.Message); Close(); } } public void UpdateDatasWidget() { datasGrid.ItemsSource = null; datasGrid.ItemsSource = cabanesDatasList; } private void SaveDatas() { try { // On enregistre la liste des cabanes StreamWriter fileWriter = new StreamWriter("Datas/Cabanes/" + selectedCabaneName + ".drisgdat"); foreach (CabaneDataClass data in cabanesDatasList) { String newLine = data.MDate+"§"+data.NomChantier+"§"+data.MDateRetour+"§"; newLine = newLine.Remove(newLine.Length - 1, 1); fileWriter.WriteLine(newLine); } fileWriter.Close(); MessageBox.Show("Données sauvegardées !", "Information", MessageBoxButton.OK, MessageBoxImage.Information); } catch (Exception ex) { MessageBox.Show("Le fichier 'Datas/Cabanes/" + selectedCabaneName + ".drisgdat' est introuvable. Données non sauvegardées. (Code 5)", "Erreur", MessageBoxButton.OK, MessageBoxImage.Error); Console.WriteLine(ex.Message); } datasSaved = true; } private void Close_Click(object sender, RoutedEventArgs e) { if (datasSaved) { Close(); } else { MessageBoxResult result = MessageBox.Show("Vos données ne sont pas sauvegarder. Voulez-vous sauvegarder avant de fermer ?", "Demande de confirmation", MessageBoxButton.YesNo, MessageBoxImage.Exclamation); if (result == MessageBoxResult.Yes) { SaveDatas(); } Close(); } } private void Quit_Click(object sender, EventArgs e) { if (!datasSaved) { MessageBoxResult result = MessageBox.Show("Vos données ne sont pas sauvegarder. Voulez-vous sauvegarder avant de fermer ?", "Demande de confirmation", MessageBoxButton.YesNo, MessageBoxImage.Exclamation); if (result == MessageBoxResult.Yes) { SaveDatas(); } } } private void Add_Click(object sender, RoutedEventArgs e) { cabanesDatasList.Add(new CabaneDataClass() { Id = cabanesDatasList.Count + 1 }); UpdateDatasWidget(); datasSaved = false; } private void Remove_Click(object sender, RoutedEventArgs e) { MessageBoxResult result = MessageBox.Show("Voulez-vous supprimer cette ligne ?", "Demande de confirmation", MessageBoxButton.YesNo, MessageBoxImage.Exclamation); if (result == MessageBoxResult.Yes) { CabaneDataClass cabaneToRemove = (CabaneDataClass)((Button)sender).DataContext; bool lineRemoved = false; for (int i = 0; i < cabanesDatasList.Count; i++) { if (cabanesDatasList[i].Id == cabaneToRemove.Id && cabanesDatasList[i].NomChantier == cabaneToRemove.NomChantier) { cabanesDatasList.RemoveAt(i); UpdateDatasWidget(); lineRemoved = true; break; } } if (!lineRemoved) { MessageBox.Show("Une erreur est survenue. La ligne n'a pas été supprimé. (Code 3)", "Erreur", MessageBoxButton.OK, MessageBoxImage.Error); } } datasSaved = false; } private void Save_Click(object sender, RoutedEventArgs e) { SaveDatas(); } private void Quit_Click(object sender, System.ComponentModel.CancelEventArgs e) { } } // Date - Nom chantier - Date retour public class CabaneDataClass { public int Id { get; set; } public String MDate { get; set; } public String NomChantier { get; set; } public String MDateRetour { get; set; } } } |
Lorsque je clique sur le bouton "Ouvrir", la fonction Open_Click
(Ligne 152 du fichier MainWindow.xaml.cs) est appelée.
Elle récupère l'objet CabaneClass qui correspond à la ligne sur laquelle se trouve le bouton pour ouvrir une cabane. Elle passe ensuite le nom de cette cabane à la nouvelle fenêtre, qui va alors ouvrir le fichier de cette cabane (le fichier se nomme : NomDeLaCabane.drisgdat).
La fonction qui est appelée lors de l'enregistrement se nomme SaveDatas
(Ligne 65 du fichier MainWindow.xaml.cs). Elle parcours le tableau contenant les données, puis les enregistre dans le fichier Datas/Cabanes.drisgdat. Ce fichier contient la liste de toutes les cabanes pour pouvoir les charger ensuite dans le programme. Mais ce n'est pas tout. Cette fonction créer aussi un fichier (si celui-ci n'existe pas) dans Datas/Cabanes/. Le fichier créer se nommera NomDeLaCabane.drisgdat. Ce fichier contiendra toutes les données de la cabane, qui seront utiles dans la deuxième fenêtre (celle qui apparaît lorsque on ouvre une cabane).
J'ai à peut près réussi à identifier le problème.
Ligne 52 du fichier CabaneWindow.xaml.cs, il y à une boucle. Si j'enlève le contenu de cette boucle, le bug est toujours présent. Par contre, si j'enlève la boucle, alors là il n'y à plus aucun problème, le logiciel fonctionne bien. Seulement, si j'enlève cette boucle, et bien plus aucune données n'est chargée !
Je ne sais donc pas trop d'où peut venir le problème.
Si quelqu'un à une idée, qu'il me la donne !
Merci !