【C#】向导式窗体

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

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

【C#】向导式窗体_第1张图片

制作过程如下:

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

【C#】向导式窗体_第2张图片

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

【C#】向导式窗体_第3张图片

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

【C#】向导式窗体_第4张图片

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_list = new List(); 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; }
        }
    }
}

至此,制作完毕。

你可能感兴趣的:(C#)