C# 我想从另一个子窗体事件关闭子窗体?

C# 我想从另一个子窗体事件关闭子窗体?,c#,forms,mdi,mdichild,C#,Forms,Mdi,Mdichild,我有一个孩子会弹出来显示数据 但当数据更改时,将创建一个新表单来显示新数据 我想关闭旧的表单,这样我就不会每次数据更改都有5000个表单 创建新表单的原因是可以在其名称中显示数据的ID 我的代码: String Pass; // used to get value from class and pass it to next form. public void ShowNewCompareDiff() //object sender, EventArgs e { FormCompare

我有一个孩子会弹出来显示数据

但当数据更改时,将创建一个新表单来显示新数据

我想关闭旧的表单,这样我就不会每次数据更改都有5000个表单

创建新表单的原因是可以在其名称中显示数据的ID

我的代码:

String Pass; // used to get value from class and pass it to next form.

public void ShowNewCompareDiff() //object sender, EventArgs e
{
    FormCompareDiff childForm = new FormCompareDiff(Pass);
    childForm.MdiParent = MdiParent;
    childForm.Text = "Comepare difference ";

    //childForm.Close(); //Not working 
    //childForm = null; //Not working

    childForm.Show();
}

private void dataGridViewResult_CellMouseClick(object sender, DataGridViewCellMouseEventArgs e)
{
    CompareXML Com = new CompareXML();
    Pass = Com.Compare(richTextBoxSQL.Text, richTextBoxPrevSQL.Text);
    ShowNewCompareDiff();
}
namespace AuditIT_1
{
    public partial class FormCompareDiff : Form
    {
        String Passed;
        public FormCompareDiff(String Pass)
        {
            Passed = Pass;
            this.StartPosition = System.Windows.Forms.FormStartPosition.Manual;
            this.Location = new System.Drawing.Point(836, 0); // Form Shows next to FormSchemaSearch
            InitializeComponent();
        }
        private void FormCompareDiff_Load(object sender, EventArgs e)
        {
            String Pass = Passed;
            CompareXML Com = new CompareXML();
            webBrowserDifferences.DocumentText = Com.ResultShow(Pass);
        }       
    }    
}
子表单FormCompareDiff:

String Pass; // used to get value from class and pass it to next form.

public void ShowNewCompareDiff() //object sender, EventArgs e
{
    FormCompareDiff childForm = new FormCompareDiff(Pass);
    childForm.MdiParent = MdiParent;
    childForm.Text = "Comepare difference ";

    //childForm.Close(); //Not working 
    //childForm = null; //Not working

    childForm.Show();
}

private void dataGridViewResult_CellMouseClick(object sender, DataGridViewCellMouseEventArgs e)
{
    CompareXML Com = new CompareXML();
    Pass = Com.Compare(richTextBoxSQL.Text, richTextBoxPrevSQL.Text);
    ShowNewCompareDiff();
}
namespace AuditIT_1
{
    public partial class FormCompareDiff : Form
    {
        String Passed;
        public FormCompareDiff(String Pass)
        {
            Passed = Pass;
            this.StartPosition = System.Windows.Forms.FormStartPosition.Manual;
            this.Location = new System.Drawing.Point(836, 0); // Form Shows next to FormSchemaSearch
            InitializeComponent();
        }
        private void FormCompareDiff_Load(object sender, EventArgs e)
        {
            String Pass = Passed;
            CompareXML Com = new CompareXML();
            webBrowserDifferences.DocumentText = Com.ResultShow(Pass);
        }       
    }    
}

您可以将
childForm
转换为类的成员变量,然后将
ShowNewCompareDiff
方法更改为如下内容:

FormCompareDiff childForm;

public void ShowNewCompareDiff()
{
    if (childForm != null)
        childForm.Dispose(); // Get rid of old form, if exists

    childForm = new FormCompareDiff(Pass);
    childForm.MdiParent = MdiParent;
    ...
}
编辑:

String Pass; // used to get value from class and pass it to next form.

public void ShowNewCompareDiff() //object sender, EventArgs e
{
    FormCompareDiff childForm = new FormCompareDiff(Pass);
    childForm.MdiParent = MdiParent;
    childForm.Text = "Comepare difference ";

    //childForm.Close(); //Not working 
    //childForm = null; //Not working

    childForm.Show();
}

private void dataGridViewResult_CellMouseClick(object sender, DataGridViewCellMouseEventArgs e)
{
    CompareXML Com = new CompareXML();
    Pass = Com.Compare(richTextBoxSQL.Text, richTextBoxPrevSQL.Text);
    ShowNewCompareDiff();
}
namespace AuditIT_1
{
    public partial class FormCompareDiff : Form
    {
        String Passed;
        public FormCompareDiff(String Pass)
        {
            Passed = Pass;
            this.StartPosition = System.Windows.Forms.FormStartPosition.Manual;
            this.Location = new System.Drawing.Point(836, 0); // Form Shows next to FormSchemaSearch
            InitializeComponent();
        }
        private void FormCompareDiff_Load(object sender, EventArgs e)
        {
            String Pass = Passed;
            CompareXML Com = new CompareXML();
            webBrowserDifferences.DocumentText = Com.ResultShow(Pass);
        }       
    }    
}
完整示例

创建新的
WindowsFormApplication
,将新的
按钮添加到
表单
,添加以下代码:

public partial class Form1 : Form
{
    Form MyForm;

    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        if (MyForm != null)
            MyForm.Dispose();

        MyForm = new Form() { Text = DateTime.Now.ToString() };
        MyForm.Show();
    }
}        

测试一下。您将看到它是如何工作的。

您可以将
childForm
转换为类的成员变量,然后将
ShowNewCompareDiff
方法更改为如下内容:

FormCompareDiff childForm;

public void ShowNewCompareDiff()
{
    if (childForm != null)
        childForm.Dispose(); // Get rid of old form, if exists

    childForm = new FormCompareDiff(Pass);
    childForm.MdiParent = MdiParent;
    ...
}
编辑:

String Pass; // used to get value from class and pass it to next form.

public void ShowNewCompareDiff() //object sender, EventArgs e
{
    FormCompareDiff childForm = new FormCompareDiff(Pass);
    childForm.MdiParent = MdiParent;
    childForm.Text = "Comepare difference ";

    //childForm.Close(); //Not working 
    //childForm = null; //Not working

    childForm.Show();
}

private void dataGridViewResult_CellMouseClick(object sender, DataGridViewCellMouseEventArgs e)
{
    CompareXML Com = new CompareXML();
    Pass = Com.Compare(richTextBoxSQL.Text, richTextBoxPrevSQL.Text);
    ShowNewCompareDiff();
}
namespace AuditIT_1
{
    public partial class FormCompareDiff : Form
    {
        String Passed;
        public FormCompareDiff(String Pass)
        {
            Passed = Pass;
            this.StartPosition = System.Windows.Forms.FormStartPosition.Manual;
            this.Location = new System.Drawing.Point(836, 0); // Form Shows next to FormSchemaSearch
            InitializeComponent();
        }
        private void FormCompareDiff_Load(object sender, EventArgs e)
        {
            String Pass = Passed;
            CompareXML Com = new CompareXML();
            webBrowserDifferences.DocumentText = Com.ResultShow(Pass);
        }       
    }    
}
完整示例

创建新的
WindowsFormApplication
,将新的
按钮添加到
表单
,添加以下代码:

public partial class Form1 : Form
{
    Form MyForm;

    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        if (MyForm != null)
            MyForm.Dispose();

        MyForm = new Form() { Text = DateTime.Now.ToString() };
        MyForm.Show();
    }
}        
测试一下。您将看到它是如何工作的。

在showNewCommareDiff()方法中,您创建FormCompareDiff表单对象,将其保留为主表单上的属性,然后您可以在每次数据更改时更新同一表单的文本,如果该属性的子对象为null,则创建新的并重新分配给它

编辑 将此方法称为

ShowNewCompareDiff(this);
在ShowNewCompareDiff()方法中,创建FormCompareDiff form对象,并将其作为主窗体上的属性保留,然后可以在每次数据更改时更新同一窗体的文本,如果子窗体的属性为null,则创建新的并重新分配给它

编辑 将此方法称为

ShowNewCompareDiff(this);

您需要明确地跟踪子窗体的生命周期。并使用属性而不是构造函数参数,这样您就可以更新子级,而不必创建新的子级。像这样:

FormCompareDiff childForm;

public void ShowNewCompareDiff()
{
    if (childForm != null) {
        childForm.WindowState = FormWindowState.Normal;
    }
    else {
        childForm = new FormCompareDiff();
        childForm.MdiParent = MdiParent;
        childForm.FormClosed += delegate { childForm = null; };
    }
    childForm.Pass = Pass;
    childForm.Show();
}

别忘了向FormCompareDiff添加公共通行证属性。

您需要明确跟踪子窗体的生命周期。并使用属性而不是构造函数参数,这样您就可以更新子级,而不必创建新的子级。像这样:

FormCompareDiff childForm;

public void ShowNewCompareDiff()
{
    if (childForm != null) {
        childForm.WindowState = FormWindowState.Normal;
    }
    else {
        childForm = new FormCompareDiff();
        childForm.MdiParent = MdiParent;
        childForm.FormClosed += delegate { childForm = null; };
    }
    childForm.Pass = Pass;
    childForm.Show();
}

别忘了向FormCompareDiff添加公共通行证属性。

我遇到了以下错误:无法访问已释放的对象。对象名称:“FormCompareDiff”。在子窗体new之前不能有if语句,在声明之前不能使用局部变量“childForm”。WindowsForms和MdiChild窗体的行为不同。如果你看我上面的代码,如果它不一样,我就不能插入你。@Pomster那么ShowNewCompareDiff方法在MdiChild表单中?它与我要关闭的子表单在不同的子表单中。我得到了这个错误:无法访问已处理的对象。对象名称:“FormCompareDiff”。在子窗体new之前不能有if语句,在声明之前不能使用局部变量“childForm”。WindowsForms和MdiChild窗体的行为不同。如果你看一下我上面的代码,如果它不一样,我就无法插入你。@Pomster那么ShowNewCompareDiff方法在MdiChild表单中?它与我要关闭的子表单不同。表单名称和标题是我正在查看的数据的ID,所以不能仅仅更改内容,我需要它作为一个新表单。ShowNewCompareDiff()正在另一个子窗体上运行,因此我无法执行此操作。关闭,如果可以执行此操作,那就太好了。关闭窗体名称和标题是我正在查看的数据的ID,因此不能仅更改内容,我需要将其作为新窗体。ShowNewCompareDiff()正在另一个子窗体上运行,因此我无法执行此操作。关闭,如果我可以的话,那就太好了。你能展示
FormCompareDiff
构造函数的代码吗?@Damith现在确定了。你能展示
FormCompareDiff
构造函数的代码吗?@Damith现在确定了。