1.FormBase界面:有“帮助,上一步,下一步,取消”按钮,这些按钮放置在一个Panel上。
namespace DataBase
{
    public partial class FormBase : Form
    {
        public FormBase()
        {
            InitializeComponent(); 
        }
        public WizardController controller = null;
 
        #region 函数
        /// <summary>
        /// 自定义函数
        /// </summary>
        public void DisableButton()
        {
            if (this.controller == null)
                return;
            if (this.controller.IsFirstForm)
            {
                this.buttonPrev.Enabled = false;
            }
            else
            {
                this.buttonPrev.Enabled = true;
            }
            if (this.controller.IsLastForm) //如果是向导的最后一个页面,显示“完成”
            {
                this.buttonNext.Text = "完成";
            }
            else    //否则显示“下一步”
            {
                this.buttonNext.Text = "下一步";
            }
        }
        protected virtual void UpdateInfo()  //由“每一步FormStep1,FormStep2…”的界面 具体实现
        {
 
        }
        protected virtual void GoNext()
        {
            UpdateInfo();
            if (this.controller.IsLastForm) //如果是向导的最后一个页面,则调用“FinishWizard()”
            {
                controller.FinishWizard();
                this.Visible = false;
            }
            else//如果是向导的最后一个页面,则调用“GoNext()”
            {
                controller.GoNext();
            }
        }
        protected virtual void GoPrev()
        {
            UpdateInfo();
            controller.GoPrev();
        }
        //protected virtual void Finish()
        //{
        //    UpdateInfo();
        //    controller.FinishWizard();
        //    this.Visible = false;
        //}
        protected virtual void Cancel()
        {
            this.controller.info = null;
            this.Close();
        }
        #endregion
 
        #region 界面控件事件
        /// <summary>
        /// 界面控件事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonPrev_Click(object sender, EventArgs e)
        {
            GoPrev();
        }
        private void buttonNext_Click(object sender, EventArgs e)
        {
            GoNext();
        }
 
        //private void buttonFinish_Click(object sender, EventArgs e)
        //{
        //    Finish();
        //}
        private void buttonCancel_Click(object sender, EventArgs e)
        {
            Cancel();
        }
        #endregion   
    }
}
 
2.一个WizardController.cs文件(非界面)
namespace DataBase
{
    public class WizardController
    {
        private ArrayList WizardForms = new ArrayList();
        private int curIndex = 0;
 
        #region 构造函数
        /// <summary>
        ///构造函数
        /// </summary>
        public WizardController()
        {
            WizardForms.Add(new FormStep1()); //frmStep1继承自FormBase
            WizardForms.Add(new FormStep2());
            WizardForms.Add(new FormStep3());
            foreach (FormBase frm in WizardForms)
            {
                frm.controller = this;
                frm.DisableButton();
            }
        }
        #endregion
 
        #region 自定义函数
        /// <summary>
        /// 自定义函数
        /// </summary>
 
        public bool IsFirstForm //属性
        {
            get { return curIndex == 0; }
        }
        public bool IsLastForm //属性
        {
            get { return curIndex == this.WizardForms.Count - 1; }
        }
 
        public void GoNext()
        {
            if (curIndex + 1 < WizardForms.Count)
            {
                ((FormBase)WizardForms[curIndex]).Visible = false;
                curIndex++;
            }
            else
            {
                return;
            }
            ((FormBase)WizardForms[curIndex]).Show();
            ((FormBase)WizardForms[curIndex]).DisableButton();
        }
 
        public void GoPrev()
        {
            if (curIndex - 1 >= 0)
            {
                ((FormBase)WizardForms[curIndex]).Visible = false;
                curIndex--;
            }
            else
            {
                return;
            }
            ((FormBase)WizardForms[curIndex]).Show();
            ((FormBase)WizardForms[curIndex]).DisableButton();
        }
 
        public void BeginWizard()
        {
            ((FormBase)WizardForms[0]).Show();
            ((FormBase)WizardForms[curIndex]).DisableButton();
        }
 
        public void FinishWizard()
        {
            curIndex = 0;
            Dispose();
        }
 
        private void Dispose()
        {
            foreach (FormBase frm in WizardForms)
            {
                frm.Close();
            }
        }
        #endregion
    }
}
 
3. FormStep1界面继承自FormBase,上面有一个Label控件,Text属性“This is FormStep1”
namespace DataBase
{
    public partial class FormStep1 : DataBase.FormBase
    {
        public FormStep1()
        {
            InitializeComponent();
        }
 
        protected override void UpdateInfo()
        {
            MessageBox.Show("第一步!","Step1",MessageBoxButtons.OK,MessageBoxIcon.Information);
        }
    }
}
 
4. FormStep2界面继承自FormBase,上面有一个Label控件,Text属性“This is FormStep2”
namespace DataBase
{
    public partial class FormStep2 : DataBase.FormBase
    {
        public FormStep2()
        {
            InitializeComponent();
        }
 
        protected override void UpdateInfo()
        {
            MessageBox.Show("第二步!", "Step2", MessageBoxButtons.OK, MessageBoxIcon.Information);
        }
    }
}
 
5. FormStep3界面继承自FormBase,上面有一个Label控件,Text属性“This is FormStep3”
namespace DataBase
{
    public partial class FormStep3 : DataBase.FormBase
    {
        public FormStep3()
        {
            InitializeComponent();
        }
        protected override void UpdateInfo()
        {
            MessageBox.Show("第三步!", "Step3", MessageBoxButtons.OK, MessageBoxIcon.Information);
        }
    }
}
6.FormTestWizard界面,上面一个buttonText属性“启动向导”
namespace DataBase
{
    public partial class FormTestWizard : Form
    {
        public FormTestWizard()
        {
            InitializeComponent();
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            WizardController controller = new WizardController();
            controller.BeginWizard();
        }
    }
}
 
7.修改程序的启动界面为“FormTestWizard
namespace DataBase
{
    static class Program
    {
        /// <summary>
        /// 应用程序的主入口点。
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new FormTestWizard());  //启动界面
        }
    }
}

C# 制作向导的更多相关文章

  1. 使用CocosSharp制作一个游戏 - CocosSharp中文教程

    注:本教程翻译自官方<Walkthrough - Building a game with CocosSharp>,官方教程有很多地方说的不够详细,或者代码不全,导致无法继续,本人在看了G ...

  2. 使用Setup Factory安装包制作工具制作安装包

    在我们开发完软件后,除了极个别案例我们把整个目录复制给客户用外,我们一般都需要做成安装包,方便整个软件的部署操作,以安装包的部署操作可能简单的是复制文件,也可能包括一些注册表.数据库等额外的操作,不过 ...

  3. 安装包制作工具 SetupFactory使用1 详解

    2014-11-19 Setup Factory 是一个强大的安装程序制作工具.提供了安装制作向导界面,即使你对安装制作不了解,也可以生成专业性质的安装程序.可建立快捷方式,也可直接在 Windows ...

  4. Inno Setup制作应用程序安装包

    我最近写了一个MFC应用程序,想发给其他的小伙伴玩一玩,直接发了个exe文件过去,结果发现小伙伴那边打不开.原来这个exe文件虽然是MFC静态编译的,但是还依赖了其他几个.dll文件,需要把这几个dl ...

  5. 您还差宝贝一张语文教学光盘!教你如何制作ISO文件

    1 大家没有发现 宝宝初上小学无法专心地做作业.读书? 我家的宝贝就是这样 做作业时 总是东搞搞,西弄弄 完全无法专心 再不就是不耐心 读一遍课本就觉得累 读三两遍就说学习是个苦差事儿 2 一直以来 ...

  6. 安装包制作工具 SetupFactory 详解

    Setup Factory 是一个强大的安装程序制作工具.提供了安装制作向导界面,即使你对安装制作不了解,也可以生成专业性质的安装程序.可建立快捷方式,也可直接在 Windows 系统的注册表加入内容 ...

  7. WinPE启动U盘的制作方法与软件下载(通用PE工具箱/老毛桃/大白菜WinPE)

    转自:http://blog.sina.com.cn/s/blog_58c380370100cp5x.html 文件大小:39.5M(支持Win7安装,早期的通用PE工具箱,小巧不过几十兆,现在都臃肿 ...

  8. 00 Cadence学习总目录

    这个系列是我学习于博士CADENCE视频教程60讲时,一边学一边记的笔记.使用的CADENCE16.6. 01-03课 了解软件 创建工程 创建元件库 分裂元件的制作方法 04课 正确使用hetero ...

  9. Android驱动开发5-8章读书笔记

    Android驱动开发读书笔记                                                              第五章 S5PV210是一款32位处理器,具有 ...

随机推荐

  1. IEEE signal processing letters 投稿经验

    转自:http://emuch.net/t.php?tid=6226942 前段时间比较幸运地中了一篇spl,把自己浅薄的经验写出来,直接从自己博客上转过来,分享给大家,望抛砖引玉吧~~~ 从投稿到录 ...

  2. 5-23 CSS知识的补充

    1,后代选择器 使用空格表示后代选择器.顾名思义,父元素的后代(包括儿子,孙子,重孙子). <!DOCTYPE html> <html lang="en"> ...

  3. META-INF文件夹中的MANIFEST.MF 的作用

    manifest文件是用来描述jar包的,它描述了该jar包的代码是谁的,什么版本,使用什么版本的类库等等....具体如下: 1.基础格式 manifest 文件的格式是很简单的,每一行都是 名-值 ...

  4. SFTP远程连接服务器上传下载文件-vs2013项目实例

    本项目仅测试远程连接服务器,支持上传,下载文件,更多功能开发请看API自行开发. 环境:win7系统,vs2013 vs2013项目实例下载地址:CSDN下载 如果没有CSDN积分,百度网盘下载(密码 ...

  5. 【Math for ML】线性代数之——向量空间

    I. Groups 在介绍向量空间之前有必要介绍一下什么Group,其定义如下: 注意定义中的\(\bigotimes\)不是乘法,而是一种运算符号的统一标识,可以是乘法也可以是加法等. 此外,如果\ ...

  6. SpringBoot整合全局异常处理&SpringBoot整合定时任务Task&SpringBoot整合异步任务

    ============整合全局异常=========== 1.整合web访问的全局异常 如果不做全局异常处理直接访问如果报错,页面会报错500错误,对于界面的显示非常不友好,因此需要做处理. 全局异 ...

  7. CF1097F Alex and a TV Show

    题目地址:CF1097F Alex and a TV Show bitset+莫比乌斯反演(个人第一道莫比乌斯反演题) 由于只关心出现次数的奇偶性,显然用bitset最合适 但我们并不直接在bitse ...

  8. Go语言模拟实现简单的区块链

    一.创建项目 按照Go语言最佳实践的思路, 在工作空间下的src目录下创建 github.com/hangzhou-huxin/blokcchain目录作为我们的项目目录,然后用GoLand工具选中这 ...

  9. MySQL中binlog参数:binlog_rows_query_log_events-记录具体的SQL【转】

    在使用RBR也就是行格式的时候,去解析binlog,需要逆向才能分析出对应的原始SQL是什么,而且,里面对应的是每一条具体行变更的内容.当然,你可以开启general log,但如果我们需要的只是记录 ...

  10. HAProxy详解(一):HAProxy介绍【转】

    一.高性能负载均衡软件HAProxy介绍: 随着互联网业务的迅猛发展,大型电商平台和门户网站对系统的可用性和可靠性要求越来越高,高可用集群.负载均衡集群成为一种热门的系统架构解决方案.在众多的负载均衡 ...