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