【问题标题】:C# Updating Form1 when closing Form2C# 关闭 Form2 时更新 Form1
【发布时间】:2013-08-26 22:19:42
【问题描述】:

我遇到用户单击 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() 方法?

【问题讨论】:

  • 你是如何在 Form1 中创建并显示 Form2 的?
  • 在打开 Form2 时,尝试在 Form2 的构造函数中通过 ref 关键字传递树视图的引用,如`public Form2(ref TreeView tv)`,在对 Form2 进行每次操作后,也更新 treeView 并刷新 Form1() Form2() 关闭,希望你理解。

标签: .net winforms c#-4.0 treeview


【解决方案1】:

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

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");
}

【讨论】:

    【解决方案2】:

    我发现完成此任务的最佳方法是在 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
    }
    

    【讨论】:

      【解决方案3】:

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

      请参阅此帖子以了解与我认为您遇到的类似问题。

      refreshing treeview component from other form

      【讨论】:

        【解决方案4】:

        我所理解的所有事情是您希望引用已经存在的 form1。您可以使用Application 访问表单。

        喜欢这段代码:

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

        【讨论】:

          【解决方案5】:

          看看:

          //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 调用(传递参数)。 我希望这会有所帮助

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-01-15
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多