-2

我有 2 个表格 1mdiparent, 1child

可以说 mdiparent = Form1 然后 child = Form2 。

我在 Form1 中得到了调用子窗体(Form2)的新按钮,例如:

private void newDocument_ItemClick(object sender, ClickEventArgs e)
        {
            Form2 formChild = new Form2();
            Form2.Show()
}

现在我的问题是:if Form2 == Close 的 if else 条件是什么?

就像是:

if (Form2.Close == true){ //condition }

or if (Form2 == Close){ //condition }

但我知道它不是正确的代码。所以希望你能帮助我:) 谢谢。

4

6 回答 6

2

如果我正确理解您的问题,您希望在 Form2 关闭时收到系统通知,以便您可以应用一些内部逻辑来避免重新打开子表单并对主界面应用某种更改。
如果这是您的问题,那么您可以在打开 Form2 时直接在 Form1 的代码中添加 Form2 的 FormClosing 事件的事件处理程序

// Flag to keep the state open/close of the child form
private bool childClosed = true;

private void newDocument_ItemClick(object sender, ClickEventArgs e)
{
    if(childClosed == true)
    {
        Form2 formChild = new Form2();
        // Setup the event handler form the Form2 closing directly here in the MDI
        formChild.FormClosing += new FormClosingEventHandler(myFormClosing);
        formChild.Show();

        // set the flag to avoid the reopening
        childClosed = false;
    }
}

// Now, when the formChild closes, you will receive the event directly here in the MDI
private void myFormClosing(object sender, FormClosingEventArgs e)
{
    // The child form is closing......
    // Do your update here, but first check the close reason

    if(e.CloseReason == CloseReason.UserClosing)
    {
       ......
       // reset the flag so you could reopen the child if needed
       childClosed = true;
    }
}
于 2013-06-10T10:27:21.497 回答
1

当表单关闭时,它也会被处理掉。因此只需检查它是否通过以下代码处理:

Form2 formChild = new Form2();
// ...
if (formChild.IsDisposed) {
    // Do someting
}
于 2013-06-10T10:28:43.327 回答
1

您可能想要使用Form.FormClosed事件或Form.FormClosing事件。可能是前者,因为您真的不想与表单的关闭进行交互。

您将创建一个方法并在事件触发时调用它,这将执行您想要的任何操作(例如隐藏按钮等)。

有关 formclosed 事件的详细信息,请参阅http://msdn.microsoft.com/en-us/library/system.windows.forms.form.formclosed.aspx

于 2013-06-10T10:21:11.117 回答
0

采用这种方法是错误的,Form 2 是在按钮单击事件中初始化的,因此,您假设表单对象不可用。

如果要更改此顺序,则应在其他位置初始化表单,例如 Form 1 的构造函数。

private Form2 form2;
public Form1()
{
    form2 = new Form2();
}

private void newDocument_ItemClick(object sender, ClickEventArgs e)
{
    if(!form2.Visible)
    {
        form2.Show();
    }else
    {
        form2.Hide();
    }
}

隐藏表单和关闭表单是不一样的,如果你真的打开和关闭了form2并在此基础上执行一些操作,那么你应该在触发form2关闭事件时在父表单上设置一个属性,做到这一点你必须将父表单作为参数传递给 form2 构造函数。

于 2013-06-10T10:28:48.890 回答
0

正如@V4Vendetta 指出的那样:有一个FormClosing事件(在表单关闭之前调用。用于告诉用户“您还没有保存”)和一个FormClosed事件(在表单关闭后调用)。

public class Form2 : Form
{
    public bool hasClosed;

    private void Form2_FormClosed(object sender, FormClosedEventArgs e)
    {
        hasClosed = true;
    }
}

有了这个,你可以做

if (formChild.hasClosed)
    // do something
于 2013-06-10T10:23:38.217 回答
0

您可以在以下代码的帮助下进行检查

foreach (Form f in Application.OpenForms)
{
        if (f.Text == formName)
        {
                    IsOpen = true;
                    break;
        }
}
if(!IsOpen)
{....do your code....}
于 2013-06-10T10:31:25.487 回答