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

时间:2011-11-13 17:30:22

标签: c# winforms visual-studio-2010

我对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非常简单,Devexpress中只有ComboBoxesTextBoxesEditButton一个。

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

    private void varDocumentsGuiPortfele_FormClosed(object sender, FormClosedEventArgs e) {
        TabControl varTabControl = tabControlKlientPortfele;

      if (varTabControl.TabPages.IndexOf(tabPageDokumentyPerKlient) == varTabControl.SelectedIndex) {
          loadTabControlKlientPortfeleBezZmianyUmowy();

      }
    }

2 个答案:

答案 0 :(得分:15)

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

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

如果有效,您想了解为什么您有不希望表单关闭的Validating事件处理程序。

您要验证的下一件事是Debug + Exceptions,勾选CLR Exceptions的Thrown框。这可以确保您不会吞下阻止表单关闭的异常。或者更糟糕的是,operating system swallowing the exception,一个令人讨厌的Windows 7问题。

答案 1 :(得分:1)

如果在close方法中遇到异常,则永远不会调用Base结束方法。

在所有内容周围尝试{} catch {}