对于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();
}
答案 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
值,因此您需要调整逻辑以使其工作,但这应该是一个良好的开端。