C# WinForm问题:提交另一个窗体后如何重新加载当前窗体?
解决WinForm中Form2提交后Form1未更新的问题
嘿,作为WinForm新手碰到这个问题太正常了,我来给你捋明白问题出在哪,以及怎么搞定它!
为什么你的代码没生效?
你调用的this.Invalidate()或者this.Refresh()只是告诉Form1「我需要重绘界面」,但如果Form1上显示的数据(比如列表、文本、统计数这些)根本没更新,重绘之后自然还是原来的样子——就像你在白纸上画了东西,擦了重画但还是用原来的底稿,结果当然没变啦!
正确的实现逻辑
核心思路是:先更新Form1的数据源,再同步更新界面控件的内容,最后按需重绘
举个实际场景的例子,假设你用Form2添加新的电影信息,Form1用ListBox展示电影列表,修改后的代码可以这样写:
// Form1中定义全局的电影数据源 private List<Movie> _movieList = new List<Movie>(); private void linkLabel2_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) { FrmAddMov frmAddMov = new FrmAddMov(); if(frmAddMov.ShowDialog() == DialogResult.OK) { // 1. 从Form2获取新添加的数据(需要在FrmAddMov里加一个公共属性暴露数据) if(frmAddMov.NewAddedMovie != null) { _movieList.Add(frmAddMov.NewAddedMovie); } // 2. 更新Form1上的控件内容(这里以ListBox为例) // 先清空旧绑定,再重新绑定更新后的数据源 listBoxMovies.DataSource = null; listBoxMovies.DataSource = _movieList; listBoxMovies.DisplayMember = "MovieTitle"; // 对应Movie类里的属性名 // 3. 如果是自定义绘制的控件或者需要强制重绘,再调用Refresh this.Refresh(); } }
不同场景的补充处理
- 如果用
DataGridView绑定DataTable:重新填充DataTable后,调用dataGridView1.DataSource = yourUpdatedDataTable; - 如果是简单的Label显示统计数值:更新数值后直接设置
labelCount.Text = _movieList.Count.ToString(); - 如果是自定义用户控件:确保控件内部有更新数据的方法,调用后再触发重绘
关于Form2的数据传递
你需要在FrmAddMov类里添加一个公共属性,用来存储用户输入的新数据,比如:
public class FrmAddMov : Form { // 公共属性,用来传递新添加的电影 public Movie NewAddedMovie { get; private set; } // 提交按钮的点击事件 private void btnSubmit_Click(object sender, EventArgs e) { // 收集用户输入,创建Movie对象 NewAddedMovie = new Movie { MovieTitle = txtTitle.Text, ReleaseYear = int.Parse(txtYear.Text) }; // 设置DialogResult为OK,关闭Form2 this.DialogResult = DialogResult.OK; this.Close(); } }
这样一来,Form2提交后,Form1就能拿到新数据、更新数据源,再同步到界面,就能看到变化啦!
内容的提问来源于stack exchange,提问作者Minh Hoàng Cao
相关产品推荐
相关产品推荐

