Winform
Windows 窗体应用程序是 C# 语言中的一个重要应用,也是 C# 语言最常见的应用。
在创建下面的时候,创建C# Winform项目即可创建窗体应用。
Winform应用主要由控件组成,而控件又包含三个部分:
属性、事件、方法。
窗体
在每一个 Windows 窗体应用程序的项目文件夹中,都会有一个默认的窗体程序 Form1.cs,并且在项目的 Program.cs 文件中指定要运行的窗体。
internal static class Program {
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
private static void Main() {
// 启动应用程序中可视的样式
Application.EnableVisualStyles();
// 控件支持 UseCompatibleTextRenderingproperty 属性,该方法将此属 性设置为默认值。
Application.SetCompatibleTextRenderingDefault(false);
// 用于设置在当前项目中要启动的窗体
Application.Run(new Form1());
}
}
窗体属性
每一个 Windows 窗体应用程序都是由若干个窗体构成的,窗体中的属性主要用于设置窗体的外观。
窗体的常用属性如下表所示。
属性 | 作用 |
---|---|
Name | 用来获取或设置窗体的名称 |
WindowState | 获取或设置窗体的窗口状态,取值有3种,即Normal(正常)、Minimized(最小化)、Maximized(最大化),默认为 Normal,即正常显示 |
StartPosition | 获取或设置窗体运行时的起始位置,取值有 5 种,即 Manual(窗体位置由 Location 属性决定)、CenterScreen(屏幕居中)、WindowsDefaultLocation( Windows 默认位置)、WindowsDefaultBounds(Windows 默认位置,边界由 Windows 决定)、CenterParent(在父窗体中居中),默认为 WindowsDefaultLocation |
Text | 获取或设置窗口标题栏中的文字 |
MaximizeBox | 获取或设置窗体标题栏右上角是否有最大化按钮,默认为 True |
MinimizeBox | 获取或设置窗体标题栏右上角是否有最小化按钮,默认为 True |
BackColor | 获取或设置窗体的背景色 |
BackgroundImage | 获取或设置窗体的背景图像 |
BackgroundImageLayout | 获取或设置图像布局,取值有 5 种,即 None(图片居左显示)、Tile(图像重复,默认值)、Stretch(拉伸)、Center(居中)、Zoom(按比例放大到合适大小) |
Enabled | 获取或设置窗体是否可用 |
Font | 获取或设置窗体上文字的字体 |
ForeColor | 获取或设置窗体上文字的颜色 |
Icon | 获取或设置窗体上显示的图标 |
窗体事件
在窗体中除了可以通过设置属性改变外观外,还提供了事件来方便窗体的操作。
窗体中常用的事件如下表所示。
事件 | 作用 |
---|---|
Load | 窗体加载事件,在运行窗体时即可执行该事件 |
MouseClick | 鼠标单击事件 |
MouseDoubleClick | 鼠标双击事件 |
MouseMove | 鼠标移动事件 |
KeyDown | 键盘按下事件 |
KeyUp | 键盘释放事件 |
FormClosing | 窗体关闭事件,关闭窗体时发生 |
FormClosed | 窗体关闭事件,关闭窗体后发生 |
窗体方法
定义的窗体都继承自 System.Windows.Form 类,能使用 Form 类中已有的成员,包括属性、方法、事件等。
实际上窗体中也有一些从 System.Windows.Form 类继承的方法,如下表所示。
方法 | 作用 |
---|---|
void Show() | 显示窗体 |
void Hide() | 隐藏窗体 |
DialogResult ShowDialog() | 以对话框模式显示窗体 |
void CenterToParent() | 使窗体在父窗体边界内居中 |
void CenterToScreen() | 使窗体在当前屏幕上居中 |
void Activate() | 激活窗体并给予它焦点 |
void Close() | 关闭窗体 |
当前窗体需要调用方法直接使用 this
关键字代表当前窗体,通过this.方法名 (参数列表)
的方式调用即可。
窗体传值
窗体之间的传值有两种方式:
1、通过静态的数据进行共享
2、通过构造函数拿到对象
1、通过静态的数据进行共享的方式来实现窗体传值。
// Form1
public partial class Form1 : Form {
public static String name = "form1的字符串";
public Form1() {
InitializeComponent();
}
// Form2
private void button2_Click(object sender, EventArgs e) {
this.textBox1.Text = Form1.name;
}
2、通过构造函数的方法获取到传递的对象。
// Form1
public partial class Form1 : Form {
public string name = "Form1的字符串";
public Form1() {
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e) {
Form2 form2 = new Form2(name);
form2.ShowDialog();
}
}
// Form2
public partial class Form2 : Form {
public Form2(string name) {
InitializeComponent();
label1.Text = name;
}
}
打开窗体
打开窗体有两种方式Show()
和ShowDialog
。
可以不断的打开窗体,每个窗体都是一个新的对象
private void button1_Click(object sender, EventArgs e) {
Form2 form2 = new Form2();
form2.Show();
}
打开模式窗体,只能打开一个窗体,且只能点击新窗体,不能点击第一个窗体
private void button1_Click(object sender, EventArgs e) {
Form2 form2 = new Form2();
form2.ShowDialog();
}
既可操作第一个窗体,又不会不断创新新窗体
public partial class Form1 : Form {
Form2 form2;
public Form1() {
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e) {
if (form2 == null) {
form2 = new Form2();
}
form2.Show();
}
}
MessageBox
在 Windows 窗体应用程序中向用户提示操作时也是采用消息框弹出的形式。
在 MessageBox 类中仅定义了 Show 的多个重载方法,该方法的作用就是弹出一个消息框。
常用的 Show 方法参数如下表所示。
方法 | 说明 |
---|---|
DialogResult Show(string text) | 指定消息框中显示的文本(text) |
DialogResult Show(string text, string caption) | 指定消息框中显示的文本(text)以及消息框的标题(caption) |
DialogResult Show(string text, string caption, MessageBoxButtons buttons) | 指定消息框中显示的文本(text)、消息框的 标题(caption)以及消息框中显示的按钮 (buttons) |
DialogResult Show(string text, string caption, MessageBoxButtons buttons, MessageBoxIcon icon) | 指定消息框中显示的文本(text)、消息框的 标题(caption )、消息框中显示的按钮 (buttons)以及消息框中显示的图标(icon) |
在上面所列出方法的参数中还涉及两个枚举类型,一个是 MessageBoxButtons,一个是 MessageBoxIcon。下面分别介绍这两个枚举类型中的具体值。
MessageBoxButtons 枚举类型主要用于设置消息框中显示的按钮,具体的枚举值如下。
- OK:在消息框中显示“确定”按钮。
- OKCancel:在消息框中显示“确定”和“取消”按钮。
- AbortRetryIgnore:在消息框中显示“中止” “重试”和“忽略”按钮。
- YesNoCancel:在消息框中显示“是” “否”和“取消”按钮。
- YesNo:在消息框中显示“是”和“否”按钮。
- RetryCancel:在消息框中显示“重试”和“取消”按钮。
MessageBoxIcon 枚举类型主要用于设置消息框中显示的图标,具体的枚举值如下。
- None:在消息框中不显示任何图标。
- Hand、Stop、Error:在消息框中显示由一个红色背景的圆圈及其中的白色X组成 的图标。
- Question:在消息框中显示由圆圈和其中的一个问号组成的图标。
- Exclamation、Warning:在消息框中显示由一个黄色背景的三角形及其中的一个感叹号组成的图标。
- Asterisk、Information:在消息框中显示由一个圆圈及其中的小写字母 i 组成的图标。
调用 MessageBox 类中的 Show 方法将返回一个 DialogResult 类型的值。
DialogResult 也是一个枚举类型,是消息框的返回值,通过单击消息框中不同的按钮得到不同的消息框返回值。
DialogResult 枚举类型的具体值如下。
- None:消息框没有返回值,表明有消息框继续运行。
- OK:消息框的返回值是 0K (通常从标签为“确定”的按钮发送)。
- Cancel:消息框的返回值是 Cancel (通常从标签为“取消”的按钮发送)。
- Abort:消息框的返回值是 Abort (通常从标签为“中止”的按钮发送)。
- Retry:消息框的返回值是 Retry (通常从标签为“重试”的按钮发送)。
- Ignore:消息框的返回值是 Ignore (通常从标签为“忽略“的按钮发送)。
- Yes:消息框的返回值是 Yes (通常从标签为“是“的按钮发送)。
- No:消息框的返回值是 No (通常从标签为“否“的按钮发送)。
在 Form1窗体中添加鼠标单击事件,并在相应的事件中添加如下代码。
public partial class Form1 : Form {
public string name = "Form1的字符串";
public Form1() {
InitializeComponent();
}
private void Form1_Click(object sender, EventArgs e) {
DialogResult dialogResult = MessageBox.Show("是否打开新窗体?", "提示",
MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
if (dialogResult == DialogResult.Yes) {
Form1 form1 = new Form1();
form1.Show();
}else if (dialogResult == DialogResult.No) {
this.Close();
}
}
}
Label & LinkLabel
在 Windows 窗体应用程序中,每个窗体都必不可少地会用到文本框和标签控件。
在 Windows 窗体应用程序中,标签控件王要分为普通的标签 (Label) 和超链接形式的标签 (LinkLabel) 。
普通标签 (Label) 控件的常用属性如下表所示。
属性名 | 作用 |
---|---|
Name | 标签对象的名称,区别不同标签唯一标志 |
Text | 标签对象上显示的文本 |
Font | 标签中显示文本的样式 |
ForeColor | 标签中显示文本的颜色 |
BackColor | 标签的背景颜色 |
Image | 标签中显示的图片 |
AutoSize | 标签的大小是否根据内容自动调整,True 为自动调整,False 为用户自定义大小 |
Size | 指定标签控件的大小 |
Visible | 标签是否可见,True 为可见,False 为不可见 |
普通标签控件 (Label) 中的事件与窗体的事件类似,常用的事件主要有鼠标单击事件、 鼠标双击事件、标签上文本改变的事件等。
超链接标签主要应用的事件是鼠标单击事件,通过单击标签完成不同的操作。
在窗体上通过单击超链接标签 (LinkLabel) 交换这两个标签上显示的信息。
public partial class Form1 : Form {
public Form1() {
InitializeComponent();
}
private void linkLabel1_Click(object sender, EventArgs e) {
string temp = label1.Text;
label1.Text = label2.Text;
label2.Text = temp;
}
}
TextBox
文本框 (TextBox) 是在窗体中输入信息时最常用的控件,通过设置文本框属性可以实现多行文本框、密码框等。
文本框还有一些不同的属性, 如下表所示:
属性名 | 作用 |
---|---|
Text | 文本框对象中显示的文本 |
MaxLength | 在文本框中最多输入的文本的字符个数 |
WordWrap | 文本框中的文本是否自动换行,如果是 True,则自动换行,如果是 False,则不能自动换行 |
PasswordChar | 将文本框中出现的字符使用指定的字符替换,通常会使用“*”字符 |
Multiline | 指定文本框是否为多行文本框,如果为 True,则为多行文本框,如果 为 False,则为单行文本框 |
ReadOnly | 指定文本框中的文本是否可以更改,如果为 True,则不能更改,即只读文本框,如果为 False,则允许更改文本框中的文本 |
Lines | 指定文本框中文本的行数 |
ScrollBars | 指定文本框中是否有滚动条,如果为 True,则有滚动条,如果为 False, 则没有滚动条 |
文本框控件最常使用的事件是文本改变事件 (TextChange),即在文本框控件中的内容改变时触发该事件。
创建一个窗体,在文本框中输入一个值,通过文本改变事件将该文本框中的值写到一个标签中。
public partial class Form1 : Form {
public Form1() {
InitializeComponent();
}
private void TextBox_Changed(object sender, EventArgs e) {
label2.Text = textBox1.Text;
}
}
Button
按钮主要用于提交页面的内容,或者是确认某种操作等。
按钮包括普通的按钮 (Button)、单选按钮 (RadioButton)。
按钮常用的属性包括在按钮中显示的文字 (Text) 以及按钮外观设置的属性,最常用的事件是单击事件。
private void Register_Click(object sender, EventArgs e) {
string username = textBox1.Text;
string password = textBox2.Text;
string rePassword = textBox3.Text;
if (string.IsNullOrEmpty(username) || string.IsNullOrEmpty(password) || string.IsNullOrEmpty(rePassword)) {
MessageBox.Show("输入的选项不能为空");
}
if (!password.Equals(rePassword)) {
MessageBox.Show("两次输入的密码不一致!");
}
// 将信息传递到主窗体
MainFrame mainFrame = new MainFrame(username, password);
mainFrame.show();
}
显示效果如下:
RadioButton
在 C# 语言中 RadioButton 是单选按钮控件,多个 RadioButton 控件可以为一组,这一组内的 RadioButton 控件只能有一个被选中。
完成选择用户权限的操作,并在消息框中显示所选的权限名。
public partial class RadioButtonForm : Form {
public RadioButtonForm() {
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e) {
string msg = "";
if (radioButton1.Checked) {
msg = radioButton1.Text;
}else if (radioButton2.Checked) {
msg = radioButton2.Text;
}else if (radioButton3.Checked) {
msg = radioButton3.Text;
}
MessageBox.Show("您选择的权限是:" + msg, "提示");
}
}
Checked 属性可用于判断单选按钮是否被选中。如果该属性的返回值为 True,则代表选中;如果返回值为 False,则表示未选中。
CheckBox
复选框主要的属性是:Name、Text、Checked。
- Name:表示这个组件的名称;
- Text:表示这个组件的标题;
- Checked:表示这个组件是否已经选中。
主要的事件就是 CheckedChanged 事件。
public partial class CheckBoxForm : Form {
public CheckBoxForm() {
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e) {
string message = "";
CheckBox[] _checkBoxes = { checkBox1, checkBox2, checkBox3, checkBox4};
for (int i = 0; i < _checkBoxes.Length; i++) {
if (_checkBoxes[i].Checked) {
message += _checkBoxes[i].Text;
}
}
MessageBox.Show("您选择的爱好是:" + message, "提示");
}
}
显示的效果如下所示:
CheckedListBox
复选列表框显示的效果与复选框类似,但在选择多个选项时操作比一般的复选框更方便。
public partial class CheckedListBox : Form {
public CheckedListBox() {
InitializeComponent();
System.Windows.Forms.CheckedListBox.ObjectCollection objectCollection = checkedListBox1.Items;
objectCollection.Add("苹果");
objectCollection.Add("荔枝");
objectCollection.Add("梨子");
objectCollection.Add("香蕉");
objectCollection.Add("西瓜");
objectCollection.Add("葡萄");
objectCollection.Add("龙眼");
}
private void button1_Click(object sender, EventArgs e) {
string message = "";
for (int i = 0; i < checkedListBox1.CheckedItems.Count; i++) {
message += checkedListBox1.CheckedItems[i].ToString();
}
if (!string.IsNullOrEmpty(message)) {
MessageBox.Show("您购买的水果有:" + message, "提示");
} else {
MessageBox.Show("您没有选购水果!", "提示");
}
}
}
其中选中蓝色效果是SelectedItem属性,而勾选的项则是CheckedItems属性。
显示的效果如下所示:
ListBox
列表框 (ListBox) 将所提供的内容以列表的形式显示出来,并可以选择其中的一项或多项内容,从形式上比使用复选框更好一些。
在列表框控件中有一些属性与前面介绍的控件不同,如下表所示。
属性名 | 作用 |
---|---|
MultiColumn | 获取或设置列表框是否支持多列,如果设置为 True,则表示支持多列; 如果设置为 False,则表示不支持多列,默认为 False |
Items | 获取或设置列表框控件中的值 |
SelectedItems | 获取列表框中所有选中项的集合 |
SelectedItem | 获取列表框中当前选中的项 |
SelectedIndex | 获取列表框中当前选中项的索引,索引从 0 开始 |
SelectionMode | 获取或设置列表框中选择的模式,当值为 One 时,代表只能选中一项, 当值为 MultiSimple 时,代表能选择多项,当值为 None 时,代表不能选 择,当值为 MultiExtended 时,代表能选择多项,但要在按下 Shift 键后 再选择列表框中的项 |
列表框还提供了一些方法来操作列表框中的选项,由于列表框中的选项是一个集合形式的,列表项的操作都是用 Items 属性进行的。
public partial class ListBoxForm : Form {
public ListBoxForm() {
InitializeComponent();
listBox1.SelectionMode = SelectionMode.MultiSimple;
ListBox.ObjectCollection listBox1Items = listBox1.Items;
listBox1Items.Add("篮球");
listBox1Items.Add("排球");
listBox1Items.Add("羽毛球");
listBox1Items.Add("乒乓球");
listBox1Items.Add("游泳");
listBox1Items.Add("阅读");
listBox1Items.Add("写作");
}
private void button1_Click(object sender, EventArgs e) {
string msg = "";
for (int i = 0; i < listBox1.SelectedItems.Count; i++) {
msg += listBox1.SelectedItems[i].ToString();
}
if (!string.IsNullOrEmpty(msg)) {
MessageBox.Show("您选择的爱好是:" + msg, "提示");
} else {
MessageBox.Show("您没有选择爱好", "提示");
}
}
}
ListBox实现多选需要设置窗体的 SelectionMode 属性为 MultiSimple。
运行上面的示例,效果如下:
下面实现一个对ListBox进行动态添加和删除的操作:
public partial class ListBoxForm : Form {
public ListBoxForm() {
InitializeComponent();
listBox1.SelectionMode = SelectionMode.MultiSimple;
ListBox.ObjectCollection listBox1Items = listBox1.Items;
listBox1Items.Add("篮球");
listBox1Items.Add("排球");
listBox1Items.Add("羽毛球");
listBox1Items.Add("乒乓球");
listBox1Items.Add("游泳");
listBox1Items.Add("阅读");
listBox1Items.Add("写作");
}
private void button1_Click(object sender, EventArgs e) {
string msg = "";
for (int i = 0; i < listBox1.SelectedItems.Count; i++) {
msg += listBox1.SelectedItems[i].ToString();
}
if (!string.IsNullOrEmpty(msg)) {
MessageBox.Show("您选择的爱好是:" + msg, "提示");
} else {
MessageBox.Show("您没有选择爱好", "提示");
}
}
// 添加
private void button3_Click(object sender, EventArgs e) {
string text = textBox1.Text;
listBox1.Items.Add(text);
}
// 删除
private void button2_Click(object sender, EventArgs e) {
for (int i = 0; i < listBox1.SelectedItems.Count; i++) {
string str = (string) listBox1.SelectedItems[i];
listBox1.Items.Remove(str);
}
}
}
运行上面的示例,效果如下:
注意:在迭代的时候不要使用foreach
语句,因为foreach语句在迭代过程中不允许修改列表。
ComboBox
组合框(ComboBox)控件也称下拉列表框,用于选择所需的选项,例如在注册学生信息时选择学历、专业等。
使用组合框可以有效地避免非法值的输入。
在组合框中也有一些经常使用的属性,如下表所示。
属性名 | 作用 |
---|---|
DropDownStyle | 获取或设置组合框的外观,如果值为 Simple,同时显示文本框和列表框,并且文本框可以编辑;如果值为 DropDown,则只显示文本框,通过鼠标或键盘的单击事件展开文本框,并且文本框可以编辑;如果值为 DropDownList,显示效果与 DropDown 值一样,但文本框不可编辑。默认情况下为 DropDown |
Items | 获取或设置组合框中的值 |
Text | 获取或设置组合框中显示的文本 |
MaxDropDownltems | 获取或设置组合框中最多显示的项数 |
Sorted | 指定是否对组合框列表中的项进行排序,如果值为 True,则排序, 如果值为 False,则不排序。默认情况下为 False |
根据题目要求,创建一个名为 ComboBoxForm 的窗体:
public partial class ComboBoxForm : Form {
public ComboBoxForm() {
InitializeComponent();
}
private void ComboBoxForm_Load(object sender, System.EventArgs e) {
comboBox1.Items.Add("计算机应用");
comboBox1.Items.Add("英语");
comboBox1.Items.Add("会计");
comboBox1.Items.Add("软件工程");
comboBox1.Items.Add("网络工程");
}
private void combox1_Select(object sender, System.EventArgs e) {
MessageBox.Show("您选择的专业是:" + comboBox1.Text, "提示");
}
private void button1_Click(object sender, System.EventArgs e) {
if (string.IsNullOrEmpty(textBox1.Text)) {
MessageBox.Show("请输入专业!", "提示");
return;
}
if (comboBox1.Items.Contains(textBox1.Text)) {
MessageBox.Show("该专业已存在!");
return;
}
comboBox1.Items.Add(textBox1.Text);
}
private void button2_Click(object sender, System.EventArgs e) {
if (string.IsNullOrEmpty(textBox1.Text)) {
MessageBox.Show("请输入要删除的专业", "提示");
return;
}
if (!comboBox1.Items.Contains(textBox1.Text)) {
MessageBox.Show("您输入的专业不存在", "提示");
return;
}
comboBox1.Items.Remove(textBox1.Text);
MessageBox.Show("您删除了专业:" + textBox1.Text, "提示");
}
}
运行上面的示例,效果如下: