【C#】向导式窗体

C#窗体的向导式窗口,不像VC6中《【mfc】利用单一对话框内的分页技术实现向导功能》(点击打开链接)的是用MDI窗体来做的,而是用一个Panel中镶嵌多个窗体的方式来完成的。不知道为何网上对此的资料甚少,可能对这种向导式窗体的需求没这么大吧?

如下的一个程序,设置了3页,一直按到最后,实现3个对话框的相加。这样能够有效地减少这个窗体占用屏幕的大小。


制作过程如下:

1、首先上一张解决方案结构图,窗体还是要建的,除了Form1主窗体外,Page1、Page2、Page3都是镶嵌在里面的东东。


2、各个内窗体的Page1、Page2、Page3的布局、需要修改的属性如下,唯一需要注意的是,这里的Page1、2、3的大小要与Form1内的Panel容器大小,否则有一定的拉伸,导致位置不好控制。


Form1的布局、需要修改的属性如下,记得添加一个Load事件完成初始化的工作,不建议将初始化的代码都放在其构造函数里面~


3、Form1的代码如下,需要注意的是,要放置一个子窗体到Panel中,首先要禁用其TopLevel否则会出现“无法将顶级控件添加到控件”的错误,之后设置其父亲,并且以拉伸方式填充。设置一个容器存放内窗体,让各个内窗体能够通过遍历这个容器完成所有的操作,由于第0个位置给我设置为null,因此遍历时候i应该从1开始。否则,对null进行操作会出现“未将对象引用设置到对象的实例”的错误。最后收集各个内窗体文本框的内容,用到了《【C#】利用正则表达式判断输入是否为纯数字、容器类》(点击打开链接)中正则表达式判断其是否是数,这样你就不用浪费一个try-catch处理一个parse异常。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Text.RegularExpressions;//用到了正则表达式  


namespace wizard
{
    public partial class Form1 : Form
    {
        //全局变量,使其被各个事件所操作
        List<Form> form_list = new List<Form>();
        Page1 page1 = new Page1();
        Page2 page2 = new Page2();
        Page3 page3 = new Page3();
        int page = 1;
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            //将Page1、2、3都放到Panel中
            page1.TopLevel = false;
            page1.Parent = panel1;
            page1.Dock = DockStyle.Fill;

            page2.TopLevel = false;
            page2.Parent = panel1;
            page2.Dock = DockStyle.Fill;

            page3.TopLevel = false;
            page3.Parent = panel1;
            page3.Dock = DockStyle.Fill;

            form_list.Add(null);//在0这个位置压入一个null,主要是为了方便操作从1开始计数
            form_list.Add(page1);
            form_list.Add(page2);
            form_list.Add(page3);

            page1.Show();//显示page1
            button1.Enabled = false;//开始是第一页,禁用button1“上一页”按钮
        }

        private void button1_Click(object sender, EventArgs e)
        {
            page--;
            button2.Enabled = true;
            button2.Text = "下一页>>";
            if (page == 1)//翻到最前面,自然不让再翻前一页
            {
                button1.Enabled = false;
            }
            for (int i = 1; i < form_list.Count; i++)
            {//除了当前页的窗体展示,以外其余窗体都隐藏
                if (i == page)
                {
                    form_list[i].Show();
                }
                else
                {
                    form_list[i].Hide();
                }
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            if (page < 3)//分用户翻到最后一页与没翻到最后一页的情况
            {
                page++;
                button1.Enabled = true;

                if (page == 3)
                {
                    button2.Text = "完成!";
                }
                for (int i = 1; i < form_list.Count; i++)//除了当前页的窗体展示,以外其余窗体都隐藏
                {
                    if (i == page)
                    {
                        form_list[i].Show();
                    }
                    else
                    {
                        form_list[i].Hide();
                    }
                }
            }
            else
            {
                //取数
                string page1_text = page1.textBox1_text;
                string page2_text = page2.textBox1_text;
                string page3_text = page3.textBox1_text;
                //判断是否是数
                Regex regex = new Regex("^[0-9]+([.]{1}[0-9]+){0,1}$");
                if (regex.IsMatch(page1_text) && regex.IsMatch(page2_text) && regex.IsMatch(page3_text))
                {
                    float total = float.Parse(page1_text) + float.Parse(page2_text) + float.Parse(page3_text);//求和
                    MessageBox.Show("总计:" + total, this.Text);
                }
                else
                {
                    MessageBox.Show("你输入任意一个不是数~", this.Text);
                }
            }
        }
    }
}

Panel1的代码如下,唯一需要注意的是,给文本框的文本设置一个Getter与Setter,使其公有化,让其余窗体能够操作。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace wizard
{
    public partial class Page1 : Form
    {
        public Page1()
        {
            InitializeComponent();
        }

        public string textBox1_text//使textBox1.Text公有化,让别的窗体可以访问~
        {
            get { return this.textBox1.Text; }
            set { this.textBox1.Text = value; }
        }

    }
}

其余Page2、Page3的代码几乎是Page1一模一样了:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace wizard
{
    public partial class Page2 : Form
    {
        public Page2()
        {
            InitializeComponent();
        }
        public string textBox1_text//使textBox1.Text公有化,让别的窗体可以访问~
        {
            get { return this.textBox1.Text; }
            set { this.textBox1.Text = value; }
        }
    }
}

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace wizard
{
    public partial class Page3 : Form
    {
        public Page3()
        {
            InitializeComponent();
        }
        public string textBox1_text//使textBox1.Text公有化,让别的窗体可以访问~
        {
            get { return this.textBox1.Text; }
            set { this.textBox1.Text = value; }
        }
    }
}

至此,制作完毕。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值