日期:2014-05-17  浏览次数:21720 次

c#重新加载主窗体
 我想点击子窗体的某一个按钮,(现在的窗体已经有好多变化了,可能有几个窗体打开了),点击后,然后恢复刚加载的时候的样子,只出现第一次运行时的主窗体。有点像刷新,怎么办啊??
因为我在子窗体点击的刷新按钮,//this.Refresh();//和  this.OnLoad(e); 
只刷新了现在的子窗口,这两个都不行,我是想出现刚运行的时候,只出现主窗体。
网上说用重新加载,能不能用代码解释一下
例:主窗体form1,按钮buttonShow,点击出现子窗体form2.子窗体的刷新按钮,buttonUpdate。点击重新运行form1.。。。
c#

------解决方案--------------------
遍历主窗体的所有子窗体,把它们都关了不就可以了吗?

------解决方案--------------------
那你自动把程序退出,并用代码启动你的程序

System.Diagnostics.Process.Start(启动你的程序);
Application.Exit(); //退出当前的程序


或者
你在主窗体里写一个初始的方法
这个方法把所有子窗体关闭,并恢复主窗体一开始的位置(这个位置在主窗体起来时记在一个变量里),当你要回复初始时调用此方法
------解决方案--------------------
就winform来说,总要有一个初始窗体。(我们不讨论修改这个窗体的复杂问题)

那么你的所谓“我是想出现刚运行的时候,只出现主窗体”,这个主窗体只能是一个子窗体。

比如说,在你的初始窗体(比如说是登录窗体)中,当登陆完毕,验证用户名密码正确,之后可以写:
void Logon()
{
    var f = new MainForm();
    f.FormClosed += f_FormClosed;
    f.Show();
    this.Hide();
}

void f_FormClosed(object sender, FormClosedEventArgs e)
{
    this.Close();
}
初始窗体隐藏自身之后,等待主窗体退出则自身也退出。

不过按照你的设计,主窗体又“重新初始化”了。为了少写一些垃圾代码,我们可以让主窗体通知初始窗体“重建”主窗体,这就需要在主窗体中自定一个事件例如叫做Refresh:
public event EventHandler<EventArgs> Refresh;

然后初始化窗体的业务逻辑流程需要重构:
    private MainForm main;

    void Logon()
    {
        CreateMainForm();
    }

    private void CreateMainForm()
    {
        main = new MainForm();
        main.FormClosed += f_FormClosed;
        main.Refresh += main_Refresh;
        main.Show();
        this.Hide();
    }

    void main_Refresh(object sender, EventArgs e)
    {
        if (main != null)
        {
            main.FormClosed -= f_FormClosed;
            main.Close();
        }
        CreateMainForm();
    }

    void f_FormClosed(object sender, FormClosedEventArgs e)
    {
        this.Close();
    }

也就是说,捕获到主窗体的Refresh事件之后,首先要卸载对其Closed事件的捕获,然后关闭它,然后再创建一个新的主窗体。

        ---------------------------

以上就是你问的“刷新、重新加载主窗体、委托思想”的代码演示。

对于你的“子窗体通知系统刷新主窗体”也是一样,也是主窗体捕获打开的Form的Refresh自定义事件的处理。只不过是要多写一句“继续抛出事件”的代码而已,例如:
void OnOpenForm1()
{
    subForm = new Form1();
    subForm.Refresh += subForm_Refresh;
}