簡體   English   中英

如何關閉子表單和子表單的子表單?

[英]How do I close a child form of a child form AND the child form?

為便於參考,我有一個父表單(1),其子表單(2)和一個子表單(3)的子表單。

我進行了搜索,發現的是打開第三個表單時隱藏第二個表單的方法。 我希望通過同時關閉第二個和第三個表格來從第三個表格直接轉到第一個表格。

在加載第三個表單時關閉第二個表單不是一種選擇,因為我在第三個表單上也有一個函數this.Close();。 為了帶我去第二個表格。

當我輸入以下內容時:

 private void btn1_Click(object sender, EventArgs e)
    {
        this.Close();
        frm2.Close();
    }

我收到一個錯誤:

“非靜態字段,方法或屬性'System.Windows.Forms.Form.Close()需要對象引用”

同樣,我想要的是一個能夠一次關閉兩個窗體(窗體2和窗體3)的命令。

編輯:

到目前為止,我的(錯誤)代碼是:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace frmGametime
{
public partial class frmX : Form
{
    public frmX()
    {
        private frmX frmTTT;
        public frmX()
        {
            InitializeComponent();
            frmTTT = new frmX();
            frmTTT.FormClosed += frmX_FormClosed;
        }

        void frmX_FormClosed(object sender, FormClosedEventArgs e)
        {
            this.Close();
        }

        private void btnMM_Click(object sender, EventArgs e)
        {
            frmTTT.Show();
        }
    }

    private void frmX_Load(object sender, EventArgs e)
    {

    }

    private void btnNG_Click(object sender, EventArgs e)
    {
        this.Close();
    }

    private void btn1_Click(object sender, EventArgs e)
    {
        this.btn1.Text = "X";

        Random rng = new Random();
        int OppChoice = rng.Next(1, 9);

        if (OppChoice == 1)
        {
            if (this.btn1.Text == "_")
            {
                this.btn1.Text = "O";
            }
            else
            {
                OppChoice++;
            }
        }
        if (OppChoice == 2)

...

if (this.btn1.Text == "X" && this.btn2.Text == "X" && this.btn3.Text == "X")
        {
            this.lblWinner.Text = "X Wins!";
            this.lblWinner.Visible = true;
        }

        if (this.btn1.Text == "X" && this.btn4.Text == "X" && this.btn7.Text == "X")
        {
            this.lblWinner.Text = "X Wins!";
            this.lblWinner.Visible = true;
        }

        if (this.btn1.Text == "X" && this.btn5.Text == "X" && this.btn9.Text == "X")
        {
            this.lblWinner.Text = "X Wins!";
            this.lblWinner.Visible = true;
        }

        if (this.btn2.Text == "X" && this.btn5.Text == "X" && this.btn8.Text == "X")
        {
            this.lblWinner.Text = "X Wins!";
            this.lblWinner.Visible = true;
        }

        if (this.btn3.Text == "X" && this.btn6.Text == "X" && this.btn9.Text == "X")
        {
            this.lblWinner.Text = "X Wins!";
            this.lblWinner.Visible = true;
        }

        if (this.btn3.Text == "X" && this.btn5.Text == "X" && this.btn7.Text == "X")
        {
            this.lblWinner.Text = "X Wins!";
            this.lblWinner.Visible = true;
        }

        if (this.btn4.Text == "X" && this.btn5.Text == "X" && this.btn6.Text == "X")
        {
            this.lblWinner.Text = "X Wins!";
            this.lblWinner.Visible = true;
        }

        if (this.btn7.Text == "X" && this.btn8.Text == "X" && this.btn9.Text == "X")
        {
            this.lblWinner.Text = "X Wins!";
            this.lblWinner.Visible = true;
        }
    }

private void btnMM_Click(object sender, EventArgs e)
    {
        this.Close();    
    }


}
}

訂閱第二個表單中第三個表單的關閉事件。 當第三個窗體關閉時,第二個窗體將看到該事件並執行它的處理程序。 在處理程序中,您可以執行此操作。

 public partial class Form2 : Form
{
    private Form2 form2;
    public Form2()
    {
        InitializeComponent();
        form2 = new Form2();
        form2.FormClosed += form2_FormClosed;
    }

    void form2_FormClosed(object sender, FormClosedEventArgs e)
    {
        this.Close();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        form2.Show();
    }
}  

您的新示例的更新答案

首先,看起來您在構造函數中有一個構造函數。 我什至不知道該如何編譯,但從外觀看,您的表格frmTTT在最后一行frmTTT.FormClosed += frmX_FormClosed;之后不再存在frmTTT.FormClosed += frmX_FormClosed;

如果要讓變量frmX:form保持活動狀態,則必須將其保留在類frmX:form的根目錄中

更改

 public frmX()
{
    private frmX frmTTT;
    public frmX()
    {
        InitializeComponent();
        frmTTT = new frmX();
        frmTTT.FormClosed += frmX_FormClosed;
    }

    void frmX_FormClosed(object sender, FormClosedEventArgs e)
    {
        this.Close();
    }

    private void btnMM_Click(object sender, EventArgs e)
    {
        frmTTT.Show();
    }
}  

private frmX frmTTT;
    public frmX()
    {
        InitializeComponent();
        frmTTT = new frmX();
        frmTTT.FormClosed += frmX_FormClosed;
    }

    void frmX_FormClosed(object sender, FormClosedEventArgs e)
    {
        this.Close();
    }

    private void btnMM_Click(object sender, EventArgs e)
    {
        frmTTT.Show();
    }  

外層

 public frmX()
{

}  

不需要,因為您已經有一個。 這就是所謂的構造函數,它初始化您的對象(創建它並使它可以使用)。 在WinForms中,您可以通過查找行InitializeComponent()輕松確定哪個是表單構造函數,然后嘗試一下。 您不應該再收到該空引用錯誤

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM