WPF C#未正确关闭窗口 - 保留旧的SQL数据

时间:2015-05-26 15:15:40

标签: c# sql wpf

我有一个WPF应用程序,它有多个可以打开的窗口。当我运行程序(从VS 2013调试)时,它会打开MainWindow.xaml。当我告诉MainWindow打开辅助Window(让我们称之为Win2.xaml)时,它会打开就好了。我可以输入条件,在SQL DB中搜索数据,并完成基本的INSERT,UPDATE,DELETE工作。

就本次对话而言,假设我曾在Customer1工作过。 Customer1现已完成,因此我保存数据并关闭窗口Win2.xaml(使用Close())。一段时间过去了,数据库有一个例程来更改数据元素(标记项目已完成,不允许Win2.xaml在搜索中找到Customer1的记录。即WHERE SENT = 0现在例程已经Customer1更改为SENT = 1)。现在我决定再次打开Win2.xaml注意:我还没有关闭MainWindow.xaml,它仍在运行)因为我想做更多的工作。 IF 我根据应用程序中的存储过程和逻辑搜索Customer1,我找不到记录;但是,检索按钮会为客户提取最后的已知数据。如果我在Retrieve按钮后面运行Stored Proc,它会返回该客户的0条记录,这正是我所期望的。

即使在Win2.xaml之后,Close()似乎也在保留资源。如果我只是重新启动调试(或停止调试并再次启动它),Win2.xaml将返回“No Customers Found”消息。

那么,我能在这做什么?这只是VS中的调试问题吗?如何彻底破坏窗口各个方面已知的所有记录,并将每个新开放视为一个真正的新窗口?

以下是一些代码:

如何从MainWindow.xaml打开窗口

private void ListViewItem_DoubleClick(object sender, MouseButtonEventArgs e)
{
    var obj = (DependencyObject) e.OriginalSource;

    while (obj != null && !Equals(obj, PharmacyLv))
    {
        if (obj.GetType() == typeof (ListViewItem))
        {
            // ReSharper disable once InconsistentNaming
            var Item = (ListViewItem) sender;
            var pf = (Forms) Item.Content;

            var msgTitle = "Form Request " + pf.FormNamePharm;
            var msgCaption = "You requested to open " + pf.FormCodePharm + " - " + pf.FormNamePharm +
                             ". \nPress OK to continue or CANCEL to select again.";
            var result = MessageBox.Show(msgCaption, msgTitle, MessageBoxButton.OKCancel,
                MessageBoxImage.Question);

            switch (result)
            {
                case MessageBoxResult.OK:
                    switch (pf.FormCodePharm)
                    {
                        case "Win2":
                            Win2();
                            Log.Info("Opening Win2");
                            break;
                        // more cases here...
                        case "":
                            break;
                    }
                    break;
                case MessageBoxResult.No:
                    break;
            }
            break;
        }
        obj = VisualTreeHelper.GetParent(obj);
    }
}

以下是Win2()

的代码
private void Win2()
{
    var wn = new Win2();
    wn.Show();
    Log.Info("Initiating Win2");
}

最后,这是关于Win2的结果......此外,解决这个问题的麻烦工作是在Window_Closed代码中。我真的不想这样做......

// Saying GoodBye gracefully...
private void Window_Closing(object sender, CancelEventArgs e)
{
    if (MessageBox.Show(
        "Be Sure That All Forms Are Completed Before Closing The Application.\nDo You Want To Close This Program?",
        "Application Close Confirmation", MessageBoxButton.YesNo, MessageBoxImage.Warning) !=
        MessageBoxResult.OK) return;
    Close();

}
private void Window_Closed(object sender, EventArgs e)
{
    System.Windows.Forms.Application.Restart();
    System.Windows.Application.Current.Shutdown();
}

如果我不得不下注,我需要在MainWindow.xaml.cs中做更多的事情来处理旧表单并在双击时创建一个新表单,但像往常一样,我对如何做是无能为力的这一点。

1 个答案:

答案 0 :(得分:1)

根据您在此处显示的代码,看起来您的Win2窗口每次都被正确销毁并重新创建。当wn超出范围(在Win2方法中)时,它将被释放。即使它不是,您每次都会创建一个窗口实例(使用new关键字),因此在最差的情况下你通过持有多个窗口实例来泄漏内存:

var wn = new Win2();

您确定自己没有抓住该窗口的的全局状态,例如在您的MainWindow或其他地方,例如某些DataTable或查询结果?这似乎是一个更可能的罪魁祸首。确保所有这些都是在窗口中创建的,而不是由其他地方的全局实例保存。