【IT168技术文档】
进行类似于上一步,下一步的操作,是比较常见的,在WebAppliction中自从2.0发布以后到是已经有类似控件可以操作了,不知道为什么在Winform中好象没有该控件(我没有确认过,不知道是否真的没有?)。所以没有办法,只好自己做了。
问题:
由于最近要做一个软件的升级程序,程序本身比较简单,无非是执行一些SQL语句,覆盖一些文件而已,但我想模仿安装程序一样,可以进行步骤操作,基本要求如下:
1、具有上一步,下一步操作;
2、进行上一步和下一步操作时,能够保持原有状态,如我已经在这一步骤中录入了一些数据,点击下一步后,发现需要退回来修改,这时点击上一步返回前一步骤,那原来录入的数据必须还在;
其实需求很简单,这里主要是讲一下我的思路,从而希望大家能够提出自己的想法,进一步完善。
解决方法:
其实,对于winform来讲,没有多少经验,本人主要是从事webapplicatioin开发,这次为了做这个升级程序,也查询了一些资料,网上查到有一个,利用命令模式来操作步骤(忘记是看自哪里了)。本文里提到的解决方法根据这个演变而来,所有的步骤都是用用户控件来实现。好了不多说了,直接看代码吧:
1、创建步骤基类
其实如果简单的话这个基类根本就不用创建,因为所有的用户控件,本身就继承自UserControl基类的。这里还要另写一个,主要是因为可能会有一些共用方法,为了便于重用,所以另外创建一个。namespace EcsPatch.PatchWizard { public class BaseWizard : 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, } }