WPF c#没有正确关闭窗口-保留旧的SQL数据
本文关键字:保留 数据 SQL 窗口 WPF | 更新日期: 2023-09-27 17:50:50
我有一个WPF应用程序,它有多个可以打开的窗口。当我运行程序(从VS 2013调试),它打开MainWindow.xaml
。当我告诉MainWindow
打开第二个Window
(让我们称之为Win2.xaml
)时,它打开得很好。我可以输入条件,在SQL数据库中搜索数据,并完成基本的INSERT、UPDATE、DELETE操作。
为了这个对话的目的,假设我在Customer1
上工作。Customer1
现在完成了,所以我保存数据并关闭窗口Win2.xaml
(使用Close()
)。一段时间过去了,数据库有一个例程改变了一个数据元素(标记一个项目完成),这应该不允许Win2.xaml
在搜索中找到Customer1
的记录。即WHERE SENT = 0
,现在例程已将Customer1
更改为SENT = 1
)。现在我决定再次打开Win2.xaml
(注意:我还没有关闭MainWindow.xaml
,它仍在运行),因为我想做更多的工作。如果我搜索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 . example .cs中做更多的事情来处理旧的表单并在双击时创建一个新的表单,但像往常一样,我不知道如何做到这一点。
根据您在这里展示的代码,看起来每次都像您的Win2窗口被销毁并正确地重新创建。当wn超出作用域(在Win2方法中)时,它将被释放。即使它不是,你每次都创建一个新的窗口实例(使用new关键字),所以在最坏的情况下,你会因为持有多个窗口实例而泄漏内存:
var wn = new Win2();
您确定您没有在该窗口的之外保持一些全局状态,例如在您的主窗口或其他地方,例如一些数据表或查询结果?这似乎是一个更可能的罪魁祸首。确保所有这些都是在窗口内新建的,而不是由其他地方的全局实例持有。