在C#中按X或Close()时,WinForms表单不会关闭

我有一些奇怪的问题,WinForm似乎拒绝关闭一些奇怪的原因。 我有一个非常简单的gui,有时我不会对X做出反应,或者当我在按钮上使用事件时它甚至到达Close()并且什么都不做..

  private void buttonZapisz_Click(object sender, EventArgs e) { string plik = textBoxDokumentDoZaladowania.Text; if (File.Exists(plik)) { string extension = Path.GetExtension(plik); string nazwaPliku = Path.GetFileName(plik); SqlMethods.databaseFilePut(plik, comboBoxTypDokumentu.Text, textBoxKomentarz.Text, sKlienciID, sPortfelID, extension, nazwaPliku); Close(); } } 

没有为FormClosedFormClosing分配事件。 那我该怎么知道出了什么问题呢。 有时X会在加载GUI之后工作,但是在我按下Button将一些内容保存到数据库后,它会在该按钮事件中到达Close()并且它仍然可见并且什么都不做。 不能使用X,也不能使用ALT + F4。 我可以绕过GUI并为ComboBox选择其他值而不会出现问题。

我像这样调用GUI:

  private void contextMenuDokumentyDodaj_Click(object sender, EventArgs e) { var lv = (ListView) contextMenuDokumenty.SourceControl; string varPortfelID = Locale.ustalDaneListViewKolumny(listViewNumeryUmow, 0); string varKlienciID = Locale.ustalDaneListViewKolumny(listViewKlienci, 0); if (lv == listViewDokumentyPerKlient) { if (varKlienciID != "") { var dokumenty = new DocumentsGui(varKlienciID); dokumenty.Show(); dokumenty.FormClosed += varDocumentsGuiKlienci_FormClosed; } } else if (lv == listViewDokumentyPerPortfel) { if (varPortfelID != "" && varKlienciID != "") { var dokumenty = new DocumentsGui(varKlienciID, varPortfelID); dokumenty.Show(); dokumenty.FormClosed += varDocumentsGuiPortfele_FormClosed; } } } 

虽然我无法关闭GUI我可以在没有问题的情况下在主gui上工作。 我可以打开相同的GUI,打开新的GUI后我可以快速关闭它。 GUI很简单,很少有ComboBoxesTextBoxesEditButton一个EditButton。

编辑: varDocumentsGuiPortfele_FormClosed代码允许我刷新GUI(根据用户现在的位置重新加载ListView)。

  private void varDocumentsGuiPortfele_FormClosed(object sender, FormClosedEventArgs e) { TabControl varTabControl = tabControlKlientPortfele; if (varTabControl.TabPages.IndexOf(tabPageDokumentyPerKlient) == varTabControl.SelectedIndex) { loadTabControlKlientPortfeleBezZmianyUmowy(); } } 

将此代码粘贴到表单类中:

  protected override void OnFormClosing(FormClosingEventArgs e) { e.Cancel = false; base.OnFormClosing(e); } 

当它工作时,您想要找出不希望表单关闭的Validating事件处理程序的原因。

您要validation的下一件事是Debug + Exceptions,勾选CLR Exceptions的Thrown框。 这可以确保您不会吞下阻止表单关闭的exception。 或者更糟糕的是, 吞噬exception的操作系统 ,一个令人讨厌的Windows 7问题。

如果在close方法中得到Exception,则永远不会调用Base关闭方法。

围绕一切尝试{} catch {}