Problème d'ouverture de fenêtre (ou autre)

Le problème exposé dans ce sujet a été résolu.

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 :D ) :

Capture

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) :

Un message d'erreur que j'ai défini dans mon code

Ainsi que celui-ci :

Capture 3

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 ! :p

Merci ! :)

+0 -0

Je viens à l'instant de trouver d'où viens le problème. C'est à cause de la ligne 90 du fichier MainWindow.xaml.cs. Lorsque j'ouvrais une cabane, et bien le fichier été en cours d'utilisation. C'est pour cela que je ne pouvais pas le lire !

J'ai donc changer cette ligne par :

1
2
fileWriter = new StreamWriter("Datas/Cabanes/" + cabane.Name + ".drisgdat");
fileWriter.Close();

Et ça fonctionne bien ! :)

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte