从表单2更新表单1(主表单)以显示处理后的图像

本文关键字:表单 处理 显示 图像 更新 | 更新日期: 2023-09-27 18:00:55

我有两个表单,Form1(主表单(和Form2。Form1显示图像文件、pdf转换等。但如果用户想查看Zip文件,Form2被称为显示列表view上所有可用Zip文件的预览。如果用户在Form2上选择了一个特定的Zip文件,则会解压缩该文件,并将图像文件发送到Form2。但是我不知道如何从Form1刷新Form2。顺便说一句,Form2中的所有图像现在都出现在Form中的变量列表中!要显示,但表单没有更新。

form2代码:

 private void btn_read_Click(object sender, EventArgs e)
    {
        Form1 f1 = new Form1();
        f1.ReadArchives(Filepath);  //this function creates the image files on Form1
       this.Close(); //close form2
       for (int index = Application.OpenForms.Count - 1; index >= 0; index--)
        {
            if (Application.OpenForms[index].Name == "Form1")
            {
                //Application.OpenForms[index].Close();//EFFECTIVE BUT CLOSES THE WHOLE APPLICATION
               Application.OpenForms[index].Invalidate(); //no effect
                 Application.OpenForms[index].Refresh();//no effect
                Application.OpenForms[index].Update();//no effect
                Application.OpenForms[index].Show();//no effect
            }
        }            
    }

从表单2更新表单1(主表单)以显示处理后的图像

因此,当您希望父窗体在子窗体上发生某些事情时执行某些操作时,适当的机制是使用事件。在这种情况下,当我们希望传递信息时,子窗体正在关闭,因此我们可以重新使用FormClosed事件。

这使得编写子窗体非常简单

public partial class Form2 : Form
{
    public string Filepath {get;set;}
    private void btn_read_Click(object sender, EventArgs e)
    {
        Close();
    }
}

然后,父窗体可以使用适当的事件来处理其余的:

public partial class Form1 : Form
{
    private void button1_Click(object sender, EventArgs args)
    {
        Form2 child = new Form2();
        child.FormClosing += (_, arg) => ReadArchives(child.Filepath);
        child.Show();
    }
    private void ReadArchives(string filepath)
    {
        throw new NotImplementedException();
    }
}

您正在代码中实例化新的Form1,这与您现有的Form1(main(不同。这就是表单不更新的原因。

在我的回答中,我展示了在不同形式之间共享变量/对象的基于事件的方法——它可以很容易地调整为传输对象集合。希望能有所帮助。