【问题标题】:Why isnt my windows form closing?为什么我的窗体没有关闭?
【发布时间】:2011-04-21 05:12:18
【问题描述】:

我正在玩一些非常简单的窗体。我有一个表单关闭事件的事件处理程序,询问用户是否要保存他们输入的内容:

private void closeNpForm(object sender, FormClosingEventArgs e)
        {
            if (!saveFlag)
            {
                if (MessageBox.Show("Do you want to save the text entered?", "Save Changes?", MessageBoxButtons.YesNo) == DialogResult.Yes)
                {
                    e.Cancel = true;
                    saveFlag = true;
                    writeToFile(this.allText.Text);
                }
            }
        }

如果用户点击是(表明他们确实想保存他们的文本),我会调用 writeToFile 方法,并设置一个标志以免再次要求他们保存:

private void writeToFile(string text)
        {
            writer = new StreamWriter("inputdata.txt");
            writer.Write(text);
            writer.Close();
            this.Close();
        }

据我所知,writeToFile 方法应该在完成后关闭表单。但这并没有发生,当我运行 writeToFile 方法时,表单只是保持打开状态。谁能告诉我我做错了什么?

据我了解,调用this.Close() 应该触发表单关闭事件,调用我的事件处理程序,由于标志现在为真,表单应该可以正常关闭。

注意,我的父类扩展了 Form 类,所以我只是使用 this 来引用我的表单实例。

【问题讨论】:

    标签: c# winforms


    【解决方案1】:

    e.Cancel = true -- 哎呀。该事件被告知取消(阅读:不关闭窗口)。

    我怀疑是因为close() 是从close 事件中调用 并且发生了一些内部破坏(要么被抑制,要么Cancel 被传播,等等)。只需清理代码(保存到文件与关闭窗口无关,尽管可能会保存文件并在按钮事件中关闭窗口。)

    编码愉快。

    【讨论】:

    • 所以调用 this.Close() 不会触发新的表单关闭事件?
    • @richzilla 我不确定它是哪一个 :-) 调试起来很容易找出到底发生了什么。在关闭事件的顶部检查 Cancel 的值(例如,警报消息框或调试器断点并观察)。这将说明发生了什么。
    【解决方案2】:

    写入文件和关闭表单是两种不同的操作。你的 writeToFile 方法中不应该有 this.Close()。

    正如 pst 所说,通过将 e.cancel 设置为 true,您基本上是在告诉 CloseForm 事件被取消,因此一旦它退出 closeNpForm 事件处理程序,它就不会关闭。

    退出 closeNpForm 后,表单会检查事件的 Cancel 属性,实际上不会继续关闭自身。

    为什么要取消关闭事件,然后调用 writeToFile 来关闭表单?

    【讨论】:

      【解决方案3】:

      除了@pst说的,不想取消关闭表单,为什么还要设置Cancel = true

      如果你删除 e.Cancel = true;this.Close(); 它应该做你想做的事。

      【讨论】:

        【解决方案4】:

        这对我有用:

         public class Form1 : Form
         {
            bool saveFlag;
        
            private void Form1_Load(object sender, EventArgs ev)
            { FormClosing += closeNpForm;
            }
        
        
            private void closeNpForm(object sender, FormClosingEventArgs e)
            {
                if (!saveFlag)
                {
                    if (MessageBox.Show("Do you want to save the text entered?", "Save Changes?", MessageBoxButtons.YesNo) == DialogResult.Yes)
                    {
                        e.Cancel = true;
                        saveFlag = true;
                        this.Close();
                    }
                }
             }
          }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-05-12
          • 2016-10-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多