C#关闭另一个窗体的问题,Close()不起作用。

3
我在form1上有这段代码。
TimerMode f2 = new TimerMode();
f2.show();

现在我想在某个时刻使用这段代码,但是什么都没有发生? Cmd = 关闭

public void DoActions(string Cmd)
{
  switch(Cmd){

  case"Open":
      TimerMode f2 = new TimerMode();
      f2.show()
      break;
  case"Closing":
       f2.Close();
       break;
}
}

你知道为什么它没有关闭吗?

我真正想要的是将其关闭。

在VB6中,我使用以下代码:

unload form2

你在哪里调用 f2.Close()?是在创建窗体的同一位置吗? - R. Martinho Fernandes
嗯,实际上f2.close在另一个方法中,我在尝试关闭它时调用该方法。注意:我已编辑上面的问题。 - Katherina
2个回答

2
很可能是线程问题。尝试这样做:
f2.Invoke((MethodInvoker)(() => f2.Close()));

如果那不起作用,使用以下修改:
public TimerMode f2 = new TimerMode();
public void DoActions(string Cmd)
{
  switch(Cmd){    
  case"Open":          
      f2.show()
      break;
  case"Closing":
       f2.Close();
       break;
  }
}

嗨,Teoman,我尝试了你说的方法。我不知道为什么,但当我运行它时,它就停在那里。如果我再次运行它,它还是会停在那里(调试时的黄色高亮显示)。 - Katherina
Teoman,你是我的英雄! =*,我不知道为什么,但你能解释一下为什么它现在工作吗?我的问题是一个线程问题吗?非常感谢! - Katherina
2
@Katherina:它能够工作是因为f2现在不再是一个局部变量,而是表单类上的一个字段。一旦方法返回,它的局部变量就会被遗忘,一旦你再次调用它,就会使用不同的局部变量。现在f2是一个字段,f2不会被遗忘。每当你调用该方法时,它始终是相同的f2。 - R. Martinho Fernandes
马丁诺所说的是真的。只需确保在类内部而不是方法内部声明表单变量,以便稍后可以访问它们(即用于关闭它)。 - Teoman Soygul
我明白了,现在更清楚了。谢谢你的简短教程,它确实帮助像我这样的初学者。 - Katherina

0
我刚刚花了几个小时想弄清楚为什么我的表单无法关闭。结果发现,我忘记检查

Debug->Exceptions

下的所有内容,因此其中一个事件处理程序悄悄地抛出了一个NullPointerException,否则会被框架捕获。我猜这将事件参数的Cancel属性设置为true,之后将其设置为false显然行不通(当我修复了NullPointer后,一切都恢复正常了)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接