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

  进行类似于上一步,下一步的操作,是比较常见的,在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

posted on 2008-05-07 09:51  李.net  阅读(2008)  评论(4编辑  收藏  举报

导航