окно закрывается после завершения метода - PullRequest
0 голосов
/ 11 января 2019

Я работаю над WPF-проектом в Visual Studio 2017 для компании, в которой я работаю, и я столкнулся с ошибкой, которую просто не могу понять ...

Вот проблема: Приложение предназначено для изменения и получения информации о шкафчиках для наших работников (многие люди приходят и уходят, поэтому каждый день происходит много изменений) Таким образом, приложение открывается с помощью главного окна (очевидно), которое содержит список (DataGrid) всех существующих шкафчиков и некоторые наиболее важные сведения о них.

Чтобы изменить что-либо о Locker (Очистка, изменение статуса и т. Д.), Вы можете дважды щелкнуть запись, чтобы открыть другое окно со всеми подробностями о выбранном Locker. Пока все хорошо!

Проблема возникает, когда я пытаюсь сохранить детали и закрыть окно, потому что это не доходит до моего метода SaveData. перед сохранением нужно пройти через несколько методов, но, кажется, он заканчивается только после завершения определенного метода (addHistory). Даже не доходя до SaveData.

Код:

public void AddHistory(Locker l) //[2.1.2.0]
{
    Debug("AddHistory() Start [2.1.2.0]");
    History h = new History();
    h.HistID = hID;
    hID++;
    h.LockerNum = l.Nr;
    h.Vis = visPop;
    h.LockerID = l.ID;
    h.TnFrstNameHist = l.TnFrstName;
    h.TnNameHist = l.TnName;
    h.FullName = l.TnName + " " + l.TnFrstName;
    h.Date = DateTime.Now.ToShortDateString();
    h.Time = DateTime.Now.ToLongTimeString();
    Debug("Before GetAction() [2.1.2.0]");
    h.ActionTaken = GetAction();
    if (h.ActionTaken == "")
    {
        h.ActionTaken = "Keine";
    }

    for (int i = 0; i < allLoc.Count(); i++)
    {
        if (l.ID == allLoc[i].ID)
        {
            allLoc[i].LocHist.Add(h);
            historyList.Add(h);
            if (allLoc[i].LocHist[0].ActionTaken == "Keine" || allLoc[i].LocHist[0].ActionTaken == "none")
                {
                    allLoc[i].LocHist.RemoveAt(0);
                }
                changedHist = allLoc[i].LocHist;
                DataGridHist.Items.Clear();
                foreach (History his in changedHist)
                {
                    DataGridHist.Items.Add(his);
                }
                break;
            }
        }

        (Application.Current.MainWindow as MainWindow).SaveData();

        Debug("AddHistory() End [2.1.2.0]");
    }

    public string GetAction() //[2.1.2.1]
    {
        Debug("GetAction Start [2.1.2.1]");
        string histOut = "";

        //loc.Nr throws up a reference exception!

        if (checkLoc.Nr != locker.Nr)
        {
            histOut = "GarderobenNummer Geändert";
        }

        if (checkLoc.SecKey != locker.SecKey)
        {
            if (locker.SecKey == true)
            {
                histOut = "Ersatzschlüssel Herausgegeben";
            }
            else
            {
                histOut = "Ersatzschlüssel zurück erhalten";
            }
        }

        if (checkLoc.Status != locker.Status)
        {
            if (checkLoc.Status == statusArr[3])
            {
                histOut = "Kontrolliert";
            }
            else if (checkLoc.Status == statusArr[4])
            {
                histOut = "Schloss Ausgetauscht";
            }
            else if (checkLoc.Status == statusArr[2])
            {
                histOut = "Vorbereitet für neue Teilnehmer";
            }
        }

        Debug("GetAction() End [2.1.2.1]");

        return histOut;
    }

private void Save_Button_Click(object sender, RoutedEventArgs e) //[2.2.0.1]
    {
        if (IsLockerChanged())
        {
            //Make Pop-up with field to enter a visum.

            NamePopUp visPop = new NamePopUp();
            visPop.ShowDialog();

            //Save the data and close the window.

            if (visCheck == true)
            {
                Debug("Before AddHistory() [2.2.0.1]");
                AddHistory(locker);
                Debug("After AddHistory() [2.2.0.1]");
                foreach(Locker l in mw.lockerList)
                {
                    if(l.ID == locker.ID)
                    {
                        Debug("Locker Found in Loop [2.2.0.1]");
                        l.Nr = locker.Nr;
                        l.TnName = locker.TnName;
                        l.TnFrstName = locker.TnFrstName;
                        l.TnWorkingGroup = locker.TnWorkingGroup;
                        l.Status = locker.Status;
                        l.SecKey = locker.SecKey;
                        l.LocHist = locker.LocHist;
                        Debug("Locker in loop copied [2.2.0.1]");
                        break;
                    }
                }

                Debug("Before SaveData() [2.2.0.1]");
                mw.SaveData();
                Debug("After SaveData() [2.2.0.1]");
                checkLoc.Nr = locker.Nr;
                checkLoc.TnName = locker.TnName;
                checkLoc.TnFrstName = locker.TnFrstName;
                checkLoc.TnWorkingGroup = locker.TnWorkingGroup;
                checkLoc.Status = locker.Status;
                checkLoc.SecKey = locker.SecKey;
                checkLoc.LocHist = locker.LocHist;

                visCheck = false;
            }
        }
        else
        {
            Msg("Es wurden keine Änderungen gefunden.");
        }
    } 

Отладка - это метод вывода информации во время отладки, в основном это просто MessageBox.Show ().

Вывод, который я получаю, когда пытаюсь проверить это:

Before AddHistory() [2.2.0.1]    
AddHistory() Start [2.1.2.0]    
Before GetAction() [2.1.2.0]    
GetAction Start [2.1.2.1]    
GetAction() End [2.1.2.1]    
AddHistory() End [2.1.2.0]

После этого окно просто закрывается ....

Я уже пытался очистить код и восстановить его, но результат остался прежним.

У кого-нибудь есть идея, что может вызвать такую ​​проблему и / или как я могу ее исправить?

Если вам нужна дополнительная информация, просто спросите!

Заранее спасибо!

По запросу Вот код для метода SaveData ():

public void SaveData(int id = -1)
    {
        if(isDebug && id != -1)
        {
            string output = "";
            foreach(Locker l in lockerList)
            {
                if(l.ID == id)
                {
                    output += "ID: " + l.ID + "\r\n";
                    output += "Nr: " + l.Nr + "\r\n";
                    output += "Room: " + l.Room + "\r\n";
                    output += "RoomName: " + l.RoomName + "\r\n";
                    output += "Seckey: " + l.SecKey + "\r\n";
                    output += "Status: " + l.Status + "\r\n";
                    output += "FrstName: " + l.TnFrstName + "\r\n";
                    output += "Name: " + l.TnName + "\r\n";
                    output += "WorkingGroup: " + l.TnWorkingGroup;
                    break;
                }
            }

            Debug(output);
        }

        string fp = saveFile; //The used Filepath

        if (!Directory.Exists(savePath)) //Check if the directory in AppData exists
        {
            //Directory doesn't exist
            Directory.CreateDirectory(savePath); //Create the directory 
        }

        //prepate to create or open a file
        BinaryFormatter bf = new BinaryFormatter();
        FileStream fs;

        if (!File.Exists(fp)) //Check if there is a file
        {
            //No File
            fs = File.Create(fp); //Create a File
            FillEmptyData();
        }
        else
        {
            //File Exists
            fs = File.Open(fp, FileMode.Open); //Open the File
        }

        DefineSaveData();

        bf.Serialize(fs, saveData); //save the Locker Data into the file.
        fs.Close();
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...