如何让多个窗体共享同一MenuStrip,为各窗体实现独立的打开保存另存为功能
解决方案
步骤1:定义统一的文件操作接口
所有内嵌到Panel的Job窗体都实现这个接口,各自封装独立的文件操作逻辑:
// 定义公共文件操作接口 public interface IJobFileOperation { // 打开文件方法,返回是否操作成功 bool OpenFile(); // 保存文件方法,返回是否操作成功 bool SaveFile(); // 另存为文件方法,返回是否操作成功 bool SaveFileAs(); }
步骤2:每个Job窗体实现该接口
以Job1为例,Job2、Job3同理编写各自的业务逻辑:
public partial class Job1 : Form, IJobFileOperation { // Job1原本的其他业务代码... public bool OpenFile() { // Job1专属的打开文件逻辑,可自定义支持的文件格式、读取处理规则 using(OpenFileDialog ofd = new OpenFileDialog()) { ofd.Filter = "文本文件|*.txt|Excel文件|*.xlsx|所有文件|*.*"; if(ofd.ShowDialog() == DialogResult.OK) { // 此处编写Job1读取文件后的业务处理逻辑 return true; } } return false; } public bool SaveFile() { // Job1专属的保存逻辑,若已有打开的文件路径可直接覆盖保存,无路径可跳转调用另存为逻辑 return true; } public bool SaveFileAs() { // Job1专属的另存为逻辑 using(SaveFileDialog sfd = new SaveFileDialog()) { sfd.Filter = "文本文件|*.txt|Excel文件|*.xlsx|所有文件|*.*"; if(sfd.ShowDialog() == DialogResult.OK) { // 此处编写文件写入逻辑 return true; } } return false; } }
步骤3:主窗体绑定共用MenuStrip的点击事件
不用为每个Job编写单独的菜单触发逻辑,共用一套事件即可自动调用当前激活窗体的对应方法:
方案A:维护当前激活窗体变量(性能更好)
// 新增变量记录当前激活的Job窗体,避免每次查询控件 private Form _currentActiveJob; // 改造原有Job切换逻辑,同步更新当前激活窗体 private void DefinirJob1ToolStripMenuItem_Click(object sender, EventArgs e) { var job = PanelSlider_Utils.Controls.Find("Job1", false)[0] as Form; job.BringToFront(); _currentActiveJob = job; } private void DefinirJob2ToolStripMenuItem_Click(object sender, EventArgs e) { var job = PanelSlider_Utils.Controls.Find("Job2", false)[0] as Form; job.BringToFront(); _currentActiveJob = job; } private void DefinirJob3ToolStripMenuItem_Click(object sender, EventArgs e) { var job = PanelSlider_Utils.Controls.Find("Job3", false)[0] as Form; job.BringToFront(); _currentActiveJob = job; } // 共用的打开菜单点击事件 private void 打开OToolStripMenuItem_Click(object sender, EventArgs e) { if(_currentActiveJob is IJobFileOperation fileOp) { fileOp.OpenFile(); } } // 共用的保存菜单点击事件 private void 保存SToolStripMenuItem_Click(object sender, EventArgs e) { if(_currentActiveJob is IJobFileOperation fileOp) { fileOp.SaveFile(); } } // 共用的另存为菜单点击事件 private void 另存为AToolStripMenuItem_Click(object sender, EventArgs e) { if(_currentActiveJob is IJobFileOperation fileOp) { fileOp.SaveFileAs(); } }
方案B:无需修改原有切换代码
调用BringToFront()后窗体会自动排在控件集合的第一位,可直接读取获取当前激活窗体:
private void 打开OToolStripMenuItem_Click(object sender, EventArgs e) { if(PanelSlider_Utils.Controls.Count > 0 && PanelSlider_Utils.Controls[0] is IJobFileOperation fileOp) { fileOp.OpenFile(); } } // 保存、另存为事件同理修改即可
内容的提问来源于stack exchange,提问作者Laurent Poulet
相关产品推荐
相关产品推荐

