使用Form.Show()但不运行代码Form.Show()之后像ShowDialog()

时间:2017-12-13 09:31:01

标签: c# winforms

我不能使用Form.ShowDialog()我想使用Form.Show()但我希望在Form.Closed之后的From.Show()之后执行代码

public void Tools(){
    var frm=new ToolFrm();
    frm.Show();

    //do something
}

我希望返回true并在表单frm打开时保持执行。

2 个答案:

答案 0 :(得分:2)

如果您想在关闭无模式表单时运行某些代码,那么您可以订阅表单的FormClosed事件:

public bool Tools()
{
    var frm = new ToolFrm();
    frm.FormClosed += Form_FormClosed;
    frm.Show();

    return true;
}

private static void Form_FormClosed(object sender, FormClosedEventArgs e)
{
    ((Form)sender).FormClosed -= Form_FormClosed;

    MessageBox.Show("Form was closed");
}

请注意,如果您不取消订阅FormClosed事件,则订阅对象将保持对表单的引用,直到订阅对象被垃圾回收。

为了防止这种行为,您可以取消订阅处理程序中的事件,就像我使用该行一样:

((Form)sender).FormClosed -= Form_FormClosed;

答案 1 :(得分:-1)

如果我正确理解您的问题,您希望在重新打开表单时运行代码。 showdialog实际上是您想要并且需要使用的选项。

    private bool Tools()
    {
        this.Hide();
        using (Form frm = new ToolFrm())
            frm.ShowDialog();
        DoSomethingYouWant(); //For example return true/false;
        this.Show();
    }

在方法DoSomethingYouWant()中,您可以执行任何操作。 当用户直到ToolFrm关闭时,表格将被隐藏。

如果要运行示例新的FormLoad()事件,可以订阅它。 将DoSomethingYouWant()替换为FormName_Load(this, e);

在加载事件中你可以这样做:

        private void Form1_Load(object sender, EventArgs e)
    {
        if(Tools){
           Messagebox.Show("true")
        }
        if(!Tools{
           Messagebox.Show("false")
        }
    }