C# 我想从另一个子窗体事件关闭子窗体?
我有一个孩子会弹出来显示数据 但当数据更改时,将创建一个新表单来显示新数据 我想关闭旧的表单,这样我就不会每次数据更改都有5000个表单 创建新表单的原因是可以在其名称中显示数据的ID 我的代码: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
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现在确定了。