阻止/解锁阻止winforms调用

时间:2011-07-26 15:17:42

标签: c# winforms

我目前正面临这种情况,我需要你的帮助:

有两个winForms Form1和Form2,form1上的单击按钮事件将启动form2。 我想启动form2并关闭(dispose)form1。

我有两种方法可以调用form2:

1)使用ShowDialog();

进行阻止调用
namespace programm
{
  public partial class Form1 : Form
  {
    public Form1()
      {
        InitializeComponent();
      }

    private void callForm2bt_Click(object sender, EventArgs e)
    {
      Form2 form2 = new Form2();
      form2.ShowDialog();
      this.Close();  
    }
  }
}

在这种情况下,一旦调用form2,我就无法关闭(处理)form1。

2)使用Show();

进行解除阻塞调用
namespace programm
{
  public partial class Form1 : Form
  {
    public Form1()
    {
        InitializeComponent();
    }

    private void callForm2bt_Click(object sender, EventArgs e)
    {
        Form2 form2 = new Form2();
        form2.Show();
        this.Close();

    }
  }
}

在这种情况下,一旦form1关闭(处置),它就会自动处理form2。

知道如何处理form1并保持form2的功能吗?

由于

3 个答案:

答案 0 :(得分:1)

要么执行反向操作:将Form2作为主窗体运行,并将其可见性设置为false,并从中启动Form1,并从{{ 1}}关闭它并将Form1可见性设置为true。所以:

Form2

使用您当前的方法,但不要关闭static void Main() { ... Application.Run(new Form2());//instead of Form1 } public class Form2 ... { //At From2.Load: private void Form2_Load(object sender, EventArgs e) { this.Hide();//the form2 will hide and show the form 1. Form1 form1 = new Form1(this); form1.Show(); } } public class Form1... { private Form2 _form2 = null; public Form1() { InitializeComponents();} public Form1(Form2 form2) : this() { _form2 = form2; } private void callForm2bt_Click(object sender, EventArgs e) { if (_form2 != null) { _form2.Show(); } this.Close(); } } ,而是在完成后将其可见性设置为false。致电Form1this.Hide();赞:

this.Visable = false;

编辑:在第一个解决方案中,您还可以使用private void callForm2bt_Click(object sender, EventArgs e) { Form2 form2 = new Form2(); form2.Show(); this.Hide();//this will hide the control from the user but it will still alive. } 并摆脱将form1.ShowDialog()实例传递给Form2构造函数,所以:

Form1

答案 1 :(得分:0)

从MSDN for Application.Run(Form)方法:
“此方法为Closed事件的mainForm参数添加了一个事件处理程序。事件处理程序调用ExitThread来清理应用程序。”
http://msdn.microsoft.com/en-us/library/ms157902(VS.90).aspx

基本上,当您的主表单退出时,所有消息泵都会停止。

我不知道这些表单在您的实际应用程序中的作用,但您必须解决此问题。一些想法 - 而正确的想法可能取决于你在做什么:

  • 如果Form1是某种对话框,您可以在Application.Run之前调用ShowDialog。例如:

    static void Main() {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Form1 fm = new Form1();
        fm.ShowDialog();
        Application.Run(new Form2());
    }
    

    当Form1关闭时,将打开Form2。 ShowDialog的返回值可用于确定是否继续并打开Form2,或退出应用程序。

  • 另一个想法可能是两次调用Application.Run。 Form1可以设置一个标志,指示是否打开Form2。

通常在我的应用程序中,Form1通常是某种对话(例如注册表单等),因此第一种行为通常是我所做的。如果对话框被取消,那么我不会运行该应用程序。

编辑:如果Form1可以分支到多个其他表单,您可以让它返回通过字段打开到Main的表单。例如:

  • 将公共字段“Form FormToOpen”添加到Form1。在构造表单时将其设置为null。
  • 按下Form1上的按钮时,给FormToOpen一个值。例如:“FormToOpen = new Form2()”。
  • 更改Application.Run行,如下所示:

    if (fm.FormToOpen != null) Application.Run(fm.FormToOpen);
    

此时,Form1有更多按钮打开其他表单是微不足道的。主要功能不需要关于每个表单的特殊知识,并且其他表单不需要关于Form1的特殊知识。

答案 2 :(得分:-1)

考虑通过Form2的构造函数注入Form1实例,它减少了类耦合并增加了灵活性,这样您就可以安全地处置form1并保留form2现场