如何在MDI项目中关闭子窗体时停止计时器事件

时间:2014-01-25 08:30:49

标签: c# winforms

对于Windows窗体而言,我不是常规,但在C#中仍然会变得更好。我正在为一个comp开发一个项目。 PROG。 class,它是一个允许多个子表单的MDI表单。

这是我的泡菜, 我在父表上有一个计时器;勾选时,处理两个标签方法..一个用于计算文本文档中的字符,另一个用于显示缩放级别。

当子窗口打开时,我可以让计时器触发并处理我的事件但是当我关闭窗口时,我试图弄清楚如何停止计时器。 我已经尝试过form.closing事件并尝试在完成时禁用计时器,但这没有帮助。

该项目是文本编辑器,对象的名称为“文档”。当对象处于Disposed状态时,我自然会得到一个异常,但我想在此之前禁用计时器。

“无法访问已置位的对象”

这是我调用子表单实例的New()方法..

        void New()
      {
          // Generate a new form from scratch
          TextEditorChild = new Form();  // Declare a variable containing a new Form method
          TextEditorChild.Text = "Document " + count.ToString();  // Text Property - also gets the forms order number
          TextEditorChild.Icon = Properties.Resources._new_doc_icon;  // Use our own icon
          TextEditorChild.MdiParent = this;  // Ensure we are using the original form as the parent form
          Document = new RichTextBox();  // Call a new RichTextBox object
          Document.Multiline = true;  // Yes, a multiline textbox
          Document.Dock = DockStyle.Fill;  // Ensure that the textbox fills the new window
          TextEditorChild.Controls.Add(Document);  // Apply our controls to the child window
          TextEditorChild.Show();  // Display the window
          count++;  // Add this window to a potnetial list of windows, should multiple be opened all at once
          timer.Enabled = true;
      }

这是我的计时器甚至处理程序......

       private void timer_Tick(object sender, EventArgs e)
    {
            charCount.Text = "Characters in the current document: " + Document.TextLength.ToString();
            zoom.Text = Document.ZoomFactor.ToString();
    }

2 个答案:

答案 0 :(得分:1)

你可以添加

TextEditorChild.FormClosing += new FormClosingEventHandler(Close);

方法new()


private void Close(object sender, FormClosingEventArgs e)
{
    timer.Enabled = false;
}

并在下面添加,作为一种新方法


这使得当表单关闭时,它会停止计时器,然后退出表单

答案 1 :(得分:1)

在您启用计时器的行之前添加以下代码:

        var tec = TextEditorChild;
        FormClosingEventHandler closing = null;
        closing = (s, e) =>
        {
            tec.FormClosing -= closing;
            if (--count == 0)
            {
                timer.Enabled = false;
            }
        };
        tec.FormClosing += closing;

当所有窗户都关闭时,这应该会停止计时器。我将模块级TextEditorChild捕获为tec,以确保在打开新的子窗口时引用不会更改。

我假设您在其他地方递减count值,因此您需要调整逻辑以使其工作,但这应该是一个良好的开端。