C#关闭Form2时更新Form1



我遇到一种情况,用户单击Form1上的按钮打开Form2。Form1的加载事件根据数据库返回的数据填充树视图。当他们将数据输入Form2时,数据库会更新,但树视图不会。如果我关闭并重新打开winform,那么它会拉入新数据。

我已经挖掘了几个小时,发现了如何从Form2调用Form1中的getdata方法,但它不起作用。我可以在调试模式下跟踪它,并验证我的dataReader包含新值,但树视图不会更新。我是这样做的。

//In form 2
Form1 frm = new Form1();
frm.getData();

什么也没发生。如果我说frm。Show(),然后它会打开一个带有更新数据的新Form1窗口,但我希望树视图在已经打开的Form1窗口中更新。

我相信这就是问题的根源。我打给frm的任何电话都发生在一个新窗口中。如何从Form2访问现有Form1窗口的getData()方法?

在不知道如何创建Form2并将其显示在Form1中的情况下,即如果是后者,您是使用.Show还是.ShowDialog,您所要做的就是使用DialogResult来确定是否调用getData方法。

Form2 frm2 = new Form2();
if (frm2.ShowDialog() == DialogResult.OK)
{
    getData();
}

如果使用Show方法,则可以侦听Form2的FormClosingFormClosed事件,并在Form1中对此作出响应。就像这样。

private void button1_Click(object sender, EventArgs e)
{
    Form2 frm2 = new Form2();
    frm2.FormClosed += frm2_FormClosed;
    frm2.Show();
}
void frm2_FormClosed(object sender, FormClosedEventArgs e)
{
    getData(); 
}
private void getData()  //Surrogate for your getData method
{
    MessageBox.Show("Getting Data");
}

我所理解的是,您想要对已经存在的form1进行引用。您可以使用Application来访问表单。

像这样的代码:

 private void Form2_FormClosing(object sender, FormClosingEventArgs e)
        {
            Form1 myfrm =Application.OpenForms["Form1"] as Form1;
            myfrm.GetData();
        }

我发现完成此任务的最佳方法是在form1上有一个方法,该方法在form2模态关闭后调用。

Form1

private void addButton_Click(object sender, EventArgs e)
{
    // Create an instance of form 2
    Form2 secondForm = new Form2();
    // Display form 2
    secondForm.ShowDialog();
    // Call a method on form1 to update information on form 1. Any code listed after 
    // the show dialog call will process after Form2 is closed.
    UpdateForm1();
}
private void UpdateForm1()
{
    // Code your updates to form1 here
}

我认为您的问题是创建Form1的新实例,而不是传递对原始Form1的引用。如果您传入对原始Form1的引用;您将更新这些实例。不是新的。

看到这篇文章类似的问题,我认为你正在经历。

从其他表单刷新树视图组件

看看:

//In Form1 opening Form2
Form2 frm = new Form2();
frm.Owner = this;
frm.Show();
//Exemple to call functions to FORM1 from FORM2
private void button1_Click(object sender, EventArgs e)
{
    Form1 frmParent = (Form1)this.Owner;
    frmParent.testeFunction();
    frmParent.InsertInGrid(textBox1.Text);
}

因此,基本上您需要在Form1中创建一个函数来从Form2调用(传递参数)。我希望这能帮助

最新更新