实战小技巧系列(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
轉載于:https://www.cnblogs.com/licongjie/archive/2008/05/07/1186291.html
總結
以上是生活随笔為你收集整理的实战小技巧系列(4):WinForm简单步骤制作的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 编写windows 控件需要注意的几个标
- 下一篇: C#中的集合(一)