进行类似于上一步,下一步的操作,是比较常见的,在WebAppliction中自从2.0发布以后到是已经有类似控件可以操作了,不知道为什么在Winform中好象没有该控件(我没有确认过,不知道是否真的没有?)。所以没有办法,只好自己做了。

  问题:

  由于最近要做一个软件的升级程序,程序本身比较简单,无非是执行一些SQL语句,覆盖一些文件而已,但我想模仿安装程序一样,可以进行步骤操作,基本要求如下:

  1、具有上一步,下一步操作;

  2、进行上一步和下一步操作时,能够保持原有状态,如我已经在这一步骤中录入了一些数据,点击下一步后,发现需要退回来修改,这时点击上一步返回前一步骤,那原来录入的数据必须还在;

  其实需求很简单,这里主要是讲一下我的思路,从而希望大家能够提出自己的想法,进一步完善。

  解决方法:

  其实,对于winform来讲,没有多少经验,本人主要是从事webapplicatioin开发,这次为了做这个升级程序,也查询了一些资料,网上查到有一个,利用命令模式来操作步骤(忘记是看自哪里了)。本文里提到的解决方法根据这个演变而来,所有的步骤都是用用户控件来实现。好了不多说了,直接看代码吧:

  1、创建步骤基类

  namespace EcsPatch.PatchWizard
  {
   public class BaseWizard : UserControl
  {

  }
  }

  其实如果简单的话这个基类根本就不用创建,因为所有的用户控件,本身就继承自UserControl基类的。这里还要另写一个,主要是因为可能会有一些共用方法,为了便于重用,所以另外创建一个。

  2、所有的用户控件都继承1中创建的基类

  namespace EcsPatch.PatchWizard
  {
    public partial class TipModel : BaseWizard
    {
      public TipModel()
     {
       InitializeComponent();
     }
    }
  }

  其它步骤的用户控件也类似,不一一贴代码了。

  3、创建辅助类

  namespace EcsPatch.Component
  {
   public class WizardUtil
   {
    private static Dictionary<WizardItem, BaseWizard> wizardList;

     /// <summary>
    /// 初始化步骤列表
    /// </summary>
     public WizardUtil()
    {
     wizardList = new Dictionary<WizardItem, BaseWizard>();
     wizardList[WizardItem.Tip] = new TipModel();
     wizardList[WizardItem.SelectPath] = new SelectPathModel();
     wizardList[WizardItem.VersionTip] = new VersionTipModel();
     wizardList[WizardItem.StartPatch] = new StartPatchModel();
     wizardList[WizardItem.Complete] = new CompleteModel();
    }

     /// <summary>
    /// 更新步骤信息
    /// </summary>
     /// <param name="key"></param>
    /// <param name="wizard"></param>
     public void SetWizard(WizardItem key, BaseWizard wizard)
    {
     wizardList[key] = wizard;
    }

    /// <summary>
    /// 获取步骤信息
    /// </summary>
    /// <param name="key"></param>
    /// <returns></returns>
    public BaseWizard GetWizard(WizardItem key)
    {
     BaseWizard wizard = wizardList[key];

      return wizard;
     }

    /// <summary>
    /// 根据状态获取步骤信息
    /// </summary>
    /// <param name="key"></param>
     /// <param name="state"></param>
    /// <returns></returns>
    public BaseWizard GetWizard(ref WizardItem key, WizardState state)
    {
      int position = (int)key;
     if (state == WizardState.Next)
     {
      position++;
     }
     else
     {
      position--;
     }
     WizardItem current = (WizardItem)position;
     key = current;
     return GetWizard(current);
    }

  }

  public enum WizardItem
   {
   Tip = 1,
   SelectPath,
   VersionTip,
   StartPatch,
   Complete
  }
  public enum WizardState
  {
   Next = 1,
   Previous,
  }
 }

  主要是把所有的用户控件先初始化放在列表中,再加上一些方法来获取和更新这些用户控件的实例。主要实现思路如下:

  A、利用枚举类型,来获取当前步骤的上一步骤用户控件实例和下一步骤用户控件实例;

  B、当执行上一步或下一步操作时,通过public void SetWizard(WizardItem key, BaseWizard wizard)方法,保存当前步骤实例,其实也就保存了当前步骤的状态信息,当再执行上一步,下一步时,从中取现来的用户控件实例,也将保存有这些信息。

  4、主界面CS

  private WizardUtil wizardUtil;

  private WizardItem currentWizardKey;

  private BaseWizard currentWizard;

  这三个变量,第一个是辅助类的实例,currentWizardKey保存当前步骤枚举,currentWizard保存当前步骤的用户控件实例。

  初始化获取第一个步骤:

   wizardUtil = new WizardUtil();

  currentWizardKey = WizardItem.Tip;

  currentWizard = wizardUtil.GetWizard(currentWizardKey);

  InitWizard();  

  InitWizard方法:

  private void InitWizard()
{
 MiddleSplit.Panel2.Controls.Clear();
 MiddleSplit.Panel2.Controls.Add(currentWizard);
 if (currentWizardKey == WizardItem.Tip)
 {
  btnPrev.Enabled = false;
 }
 else if (currentWizardKey == WizardItem.Complete)
 { 
  btnPrev.Enabled = false;
  btnNext.Enabled = false;
 }
 else
 {
  btnPrev.Enabled = true;
  btnNext.Enabled = true;
 }
}

  点击上一步骤操作:

  //保存当前步骤信息
wizardUtil.SetWizard(currentWizardKey, currentWizard);
//获取下一步骤信息
currentWizard = wizardUtil.GetWizard(ref currentWizardKey, WizardState.Next);
InitWizard();

  点击下一步骤操作:

  //保存当前步骤信息
wizardUtil.SetWizard(currentWizardKey, currentWizard);
//获取前一步骤信息
currentWizard = wizardUtil.GetWizard(ref currentWizardKey, WizardState.Previous);
InitWizard();

  代码很简单,但也确实能够实现这些基本功能,只是粗略的做了一下基本的结构,也不确定这种做法能不能满足复杂操作,一切还得靠大家自己看待了。

源码下载:/Files/licongjie/EcsPatch.rar

转载于:https://www.cnblogs.com/licongjie/archive/2008/05/07/1186291.html

实战小技巧系列(4):WinForm简单步骤制作相关推荐

  1. excel 2007 vba与宏完全剖析_Excel宏VBA小技巧系列 | 分段加合

    写在前面的话  知识产权算是一个盛产数据的行业.专利啊商标啊著作啊,都有著录项目.我们常说的专利分析.产业导航.企业导航.产业预警.竞争情报.技术综述.知识产权评议等等,常规操作之一就要先处理著录项目 ...

  2. 电影配音怎么做?短视频解说配音小技巧,其实很简单

    电影配音怎么做?短视频解说配音小技巧,其实很简单 很多小伙伴在玩短视频的时候,经常可以看到电影解说短视频,它们往往可以将一部影视剧在短时间内就说出大概内容,让我们可以很快的辨别好剧烂剧.而且电影解说短 ...

  3. 每日一个 ChatGPT 使用小技巧系列之2 - 用 ChatGPT 研读 SAP ABAP BAPI 的实现源代码

    本系列之前的文章: 与其整天担心 AI 会取代程序员,不如先让 AI 帮助自己变得更强大 每日一个 ChatGPT 使用小技巧系列之1 - 给出提纲或者素材,让 ChatGPT 帮你写作 正好昨天有朋 ...

  4. 用html制作简单日历,CCS小技巧,如何使用CSS Grid制作简单的日历,简单有趣

    原标题:CCS小技巧,如何使用CSS Grid制作简单的日历,简单有趣 日历是人类文明的重要工具之一.然后可以记住许多重要事件,并从事件的确切日期追溯到真相. 在本文中,我们将学习如何利用CSS Gr ...

  5. EXCEL常用小技巧系列01----排名

    EXCEL常用小技巧系列01----排名 在工作中,时常需要对数据进行各种方式的排名,以下总结几种常用的排名方式: 一:有相同数字时,显示同一排名且下一排名不连续 公式:=SUMPRODUCT((数据 ...

  6. 超实用的Excel自动排序小技巧,原来这么简单,早点知道就好了!

    日常制作表格中,我们总是要给Excel数据进行排列,这样更利于我们预览.大家知道有哪几种比较实用的排序方法吗?如果不知道的话,请跟我一起动动手吧! 第一种:最为实用普遍的方法:升序降序排列 步骤:单击 ...

  7. MFC小技巧系列——1、初始焦点设置

    我们在使用mfc编写windows界面应用程序时,启动mfc程序后,mfc会自动分配初始的控件焦点,有时候这些焦点被分配置到编辑框.列表框时,就会造成误操作,那么该如何避免这种情况呢,这就需要我们在程 ...

  8. word删除分节符后之前的格式乱了_很实用的14个word小技巧,能够让你在制作标书,和排版时如有神助...

    大家好!今天中标精灵给大家分享的是,一个小白怎么把"Word"从入门级别升到精通级别,也许在你急需时能用上,建议收藏慢慢学哦.Word应该是办公软件中使用频率最高的工具,但却一直不 ...

  9. (Java每日一谈:第五日——破除抑郁症的小窗户)实战小技巧:邮件发送

    今天小编会给大家讲解几个比较实用的编程常用技巧,邮件发送就是其中的一个,邮件发送的使用场景在日常的生活中也是非常常用,对于这一块的知识点不是很难以理解,大家可以学习完了之后,得到需要的时候,再找一找相 ...

最新文章

  1. 讨论丨深度学习已经成为过去?迁移学习才是真正的未来?
  2. RUP大讲堂(第一讲):RUP简介及软件过程改进
  3. linux自学笔记--nginx基本配置
  4. t-sql里Linked server跨数据库查询
  5. node、npm、vue安装 -- VUE 项目 demo 实例
  6. 如何添加评论_如何运用运镜+转场让视频更酷炫
  7. 几个学习git的地方
  8. 学习Maven之Maven Surefire Plugin(JUnit篇)(转)
  9. (String)、toString()、String.valueOf区别
  10. Matlab~30个算法
  11. 黑客编程入门 之 网络编程入门
  12. web网页设计实例作业 ——丝绸之路 (6页) 简单个人网页设计作业 静态HTML文化主题网页
  13. GNS3各种IOS下载
  14. 运维人员必须熟悉的运维工具汇总
  15. 雾霾太大看不清?这里有份数据支持你一键去雾
  16. 【python】画四叶草
  17. 谷歌文档为什么没法登录_如何将Google文档文档转换为Microsoft Office格式
  18. BERT代码的解读1---数据处理部分
  19. Hutool进行DES加解密
  20. java学生管理系统(百度人脸识别 + Swing + mysql + 邮件发送 )

热门文章

  1. 8年运维大神总结:坚持4-3-2备份策略,删库也不怕
  2. 推荐几款好用到爆炸的SSH客户端工具
  3. 技术盘点:2022年云原生架构趋势解读
  4. 课时 17-深入理解 etcd:etcd 性能优化实践(陈星宇)
  5. 阿里云引领云原生进化 | 云原生生态周报 Vol. 60
  6. log4jdbc oracle,通过weblogic配置log4jdbc数据源,在项目中使用该数据源,输出sql
  7. bp神经网络pid控制_文章推荐 | BP神经网络PID控制器在无人机编队飞行中的应用...
  8. linux :YOLO5配置(ubuntu 20.04 下安装运行yolov5)
  9. 深度学习:yolo v3训练结果测试
  10. 图像降噪算法——DnCNN / FFDNet / CBDNet / RIDNet / PMRID / SID