您的位置:首页 > 编程语言 > C#

【C#】向导式窗体

2015-12-28 20:09 639 查看
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; }
}
}
}


至此,制作完毕。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: