winform 关闭form2的同时显示form1


winform 关闭form2的同时显示form1

前言

水群的时候看到的一个高频问题, 总是有很多人问, 所以就简单写写......

问题描述

萌新在 form1 中点击按钮创建并且显示(Show) form2, 同时 form1 隐藏(Hide)

然后在 form2 关闭的时候无法操作 form1 , 最终只能通过 vs 关闭程序

如果用了非调试的话,估计就不会关了

现需要在 关闭 form2 的同时 显示 创建 form2 的 form1

思路&解决方案(简)

1.简单粗暴

最简单粗暴的做法就是在创建 form2 的同时通过构造函数或者其他什么办法将 form1 的引用传递给 form2, 然后在 form2 里面调用 form1.Show()

Form2.cs

private Form1 form1;
// 通过构造函数传递form1
public Form2(Form1 form)
{
    InitializeComponent();
    form1 = form;
}
// 为 form2 的关闭事件绑定 form1.Show() 方法
private void Form2_FormClosed(object sender, FormClosedEventArgs e)
{
    form1.Show();
}

Form1.cs

private void OpenForm2_Click(object sender, EventArgs e)
{
    // 创建 form2 时传递 form1
    var form2 = new Form2(this);
    form2.Show();
    Hide();
}

这样写基本上就可以实现上面的需求了, 如果form2可能会有多个创建者, 只需要将form2中保存的 Form1 改为 Form 即可

Form2.cs

private Form Creator;
// 通过构造函数传递form1
public Form2(Form form)
{
    InitializeComponent();
    Creator = form;
}
// 为 form2 的关闭事件绑定 form1.Show() 方法
private void Form2_FormClosed(object sender, FormClosedEventArgs e)
{
    Creator.Show();
}

使用所有窗体的基类 Form 可以简化很多操作

2.使用内置事件

微软的 Form 有一些内置的事件, 我们可以借用这些事件实现上述的需求

Form 窗体关闭时会触发 FormClosed 事件, 为该事件加个委托即可

Form1.cs

private void OpenForm2_Click(object sender, EventArgs e)
{
    var form2 = new Form2();
    // 如果只是需要实现上述的需求, 弃元即可
    form2.FormClosed += (_, _) => Show();
    form2.Show();
    Hide();
}

Form2不需要做任何改动

比较麻烦的方法

3.自定义事件/委托

使用内置的事件可以满足基本需求, 但如果需要传递数据给 From1, 可能就不大够用了

这个时候可以自定义事件或者委托

Form2.cs

public Form4()
{
    InitializeComponent();
}
// 传一个 int 类型的值
public EventHandler<int> EventWithInt;
// 传一个 DateTime 类型的值
public Action<DateTime> FuncWithTime;

private void ToggleEvent_Click(object sender, EventArgs e)
{
    EventWithInt(sender, 233);
}

private void ToggleFunc_Click(object sender, EventArgs e)
{
    FuncWithTime(DateTime.Now);
}

Form2 中定义了一个 事件 EventHandler<int> EventWithInt 和一个 委托 Action<DateTime> FuncWithTime , 分别在点击按钮的时候触发

Form1.cs

private void OpenForm2_Click(object sender, EventArgs e)
{
    var form2 = new Form2();
    form2.EventWithInt += (_, num) => OpenForm2.Text = num.ToString();
    form2.FuncWithTime += time => OpenForm2.Text = time.ToString();
    form2.Show();
}

在 Form1 中创建 Form2 时绑定对应委托, 在点击 Form2 的按钮时修改 Form1 中按钮的 Text 属性

4."多此一举"的封装

偶尔可能会出现 Form1 创建 Form2 , 然后 Form2 又创建了 Form3 ,然后 Form3 ......

以此类推, 可能到了 Form233 的时候需要 Form1.Show() , 在这种情况下上述的几个解决方案可能都还能用, 但是实现起来太过麻烦, 或者会对路径上的所有 Form 产生很大的侵入

所以在此提供一个"非常简单"的思路

public class SimpleQueue
{
    // 用字典或者其他集合类型可能会更好
    private static List<Action<string>> Events = new();

    public static void Reg(Action<string> action)
    {
        Events.Add(action);
    }
    public static void Send(string msg)
    {
        Events.ForEach(item => item(msg));
    }
}

Form1.cs

public Form1()
{
    InitializeComponent();
    SimpleQueue.Reg(item =>
        {
            if (item is "ShowForm1") Show();
            if (item == "HideForm1") Hide();
        }
    );
}

Form233.cs

private void Form233_FormClosed(object sender, FormClosedEventArgs e)
{
    SimpleQueue.Send("ShowForm1");
}

这样大致就可以实现需求了, 可还有很多问题需要解决, 有兴趣可以扩展扩展

Events 用字典或者其他集合类型可能会更好, 但只是为了做个简单演示, 不值得

我猜大概率会是重复造轮子

文章来源:https://www.cnblogs.com/CollapseNav/p/15739084.html

版权声明:本文为YES开发框架网发布内容,转载请附上原文出处连接
管理员
上一篇:C# 利用Autofac批量接口注入依赖【学习记录】
下一篇:WPF开发随笔收录-本地日志LogUtil类
评论列表

发表评论

评论内容
昵称:
关联文章

winform 关闭form2同时显示form1
Devexpress XtraTabbedMdiManager添加右键关闭菜单 (关闭当前页、关闭其它页、所有关闭
YESWin Winform开发框架 Form窗体继承关系
Xamarin.Forms 复制本地SQLite数据库
C# Winform 控件Menustrip中ToolStripMenuItem显示提示框ToolTipText
element-ui改进el-form表单样式,取消form-item底部边距:form-inner-error
C#进化——C#发展史、C#1.0-10.0语法系统性梳理、C#与JAVA对比
Part2
Winform开发快速、健壮、解耦几点建议
winform自定义控件(UserControl)加载慢研究
数值拆分为2组合
ABP VNext框架中Winform终端开发和客户端授权信息处理
winform控件截取图像
DevExpress 设置DateEdit显示年月
Winform框架多文档界面中实现双击子窗口单独弹出或拖出及拽回处理
主从表演练之采购单2-个性化调整
C# Winform选择文件夹目录
2.客户端与服务端连接
(原创)WinForm中莫名其妙小BUG——RichTextBox自动选择字词问题
网站迁移纪实:从Web Form 到 Asp.Net Core (Abp vNext 自定义开发)

联系我们
联系电话:15090125178(微信同号)
电子邮箱:garson_zhang@163.com
站长微信二维码
微信二维码