从表单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
}
}
}
因此,当您希望父窗体在子窗体上发生某些事情时执行某些操作时,适当的机制是使用事件。在这种情况下,当我们希望传递信息时,子窗体正在关闭,因此我们可以重新使用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(不同。这就是表单不更新的原因。
在我的回答中,我展示了在不同形式之间共享变量/对象的基于事件的方法——它可以很容易地调整为传输对象集合。希望能有所帮助。