一、知识点概述
在WinForm窗体开发中,控件一共有两种创建方式:
可视化创建:直接在左侧工具箱拖拽Label、Button等控件到窗体上,由系统自动生成代码;
代码动态创建(本节课重点):程序员手动编写C#代码,自己new控件、设置属性、添加到窗体。
本节课案例:不使用拖拽的方式,纯手写代码,动态创建一个Label标签控件,并熟练掌握Label所有最常用属性,掌握所有图片加载方式。
动态创建任何控件,固定永远遵循三大步骤:实例化对象 ==> 设置属性 ==> 添加到窗体集合。
二、完整可运行源代码
namespace _2Label
{
public partial class Form1 : Form
{
//窗体构造函数:程序启动最先执行
public Form1()
{
//初始化窗体和所有设计器控件
InitializeComponent();
//====================第一步:创建Label控件对象====================
Label l1 = new Label();
//====================第二步:给控件设置所有属性====================
//设置标签显示的文本内容
l1.Text = "good good study";
//设置标签字体颜色(前景色)
l1.ForeColor = Color.White;
//设置标签背景颜色,使用ARGB三原色+透明度模式
l1.BackColor = Color.FromArgb(255, 0, 0);
//设置控件尺寸:宽度100像素,高度20像素
l1.Size = new Size(100, 20);
//设置文本在Label内部的对齐方式
l1.TextAlign = ContentAlignment.MiddleCenter;
//设置控件在窗体上的坐标位置
l1.Location = new Point(200, 0);
//给Label设置背景图片(四种写法)
//1.绝对路径写法(使用转义符\\\\)
//l1.Image = Image.FromFile("C:\\\\Users\\\\Administrator\\\\Desktop\\\\img\\\\award_type_0.png");
//2.绝对路径写法(@屏蔽转义符)
//l1.Image = Image.FromFile(@"C:\\Users\\Administrator\\Desktop\\img\\award_type_0.png");
//3.相对路径写法(../返回上一级目录)
//l1.Image = Image.FromFile("../../award_type_0.png");
//4.资源文件读取(官方推荐、作业/项目首选)
l1.Image = Properties.Resources.background;
//====================第三步:把控件添加到窗体====================
this.Controls.Add(l1);
}
}
}
三、动态创建控件三大步骤(必考简答题)
步骤1:创建控件对象
语法:控件类型 变量名 = new 控件类型();
作用:在内存中开辟一块空间,创建一个空白的Label控件,此时控件只存在内存中,窗体看不到。
步骤2:设置控件相关属性
对创建好的控件进行赋值:设置文字、颜色、大小、坐标、图片、字体等样式。
步骤3:添加到窗体控件集合
语法:this.Controls.Add(控件名);
作用:把控件从内存添加到窗体集合,窗体才会渲染并显示控件。不写这句代码,页面永远看不到控件。
四、逐行代码超详细解析
1. InitializeComponent();
该方法是窗体自带初始化方法。
功能:加载窗体、初始化所有拖拽创建的控件、读取设计器里面的所有布局属性。
注意:所有窗体项目必须保留,绝对不能删除。
2. Label l1 = new Label();
手动实例化Label标签控件。
此时 l1 只是内存中的一个对象,不属于窗体,界面无法显示。
3. l1.Text = "good good study";
Text属性:用来获取/设置Label标签内部显示的文本内容。
等同于我们拖拽控件时,右侧属性面板中的Text属性。
4. l1.ForeColor = Color.White;
ForeColor(前景色):专门用来设置文字颜色。
可以直接使用Color类自带的颜色:White、Red、Black、Gray、Blue等。
5. l1.BackColor = Color.FromArgb(255, 0, 0);
BackColor(背景色):用来设置整个Label控件的背景颜色。
Color.FromArgb(A,R,G,B):通过ARGB四通道自定义颜色
-
A:透明度,取值范围0~255,数值越小越透明,255完全不透明
-
R:红色通道 0~255
-
G:绿色通道 0~255
-
B:蓝色通道 0~255
本代码(255,0,0)代表:完全不透明的纯红色背景。
6. l1.Size = new Size(100, 20);
Size属性:设置控件整体大小。
new Size(宽度,高度),单位:像素px。
本例:标签宽度100像素,高度20像素。
7. l1.TextAlign = ContentAlignment.MiddleCenter;
TextAlign:设置文本在Label内部的对齐方式,属于枚举类型。
-
TopLeft:默认,左上角对齐
-
MiddleCenter:水平居中、垂直居中(最常用)
-
BottomRight:右下角对齐
8. l1.Location = new Point(200, 0);
Location属性:设置控件在窗体上的坐标位置。
坐标规则:
-
窗体左上角为原点 (0,0)
-
X值:水平向右偏移
-
Y值:垂直向下偏移
本例:控件距离窗体左边200px,距离顶部0px。
9. Label加载图片的四种方式(最全详解)
作用:给Label设置背景图片,使用 Image.FromFile() 加载本地图片
方式一:绝对路径(转义写法)
Windows系统路径中 \\ 属于转义符号,所以路径必须写双斜杠 \\\\
缺点:写死本地路径,换电脑、移动项目图片直接失效。
方式二:@禁止转义符
在字符串前面加@,取消所有转义功能,可以直接写单斜杠 \\,简化书写。
本质仍然是绝对路径,缺点同上。
方式三:相对路径(推荐初学者)
程序运行exe默认生成在 bin/Debug 文件夹下;
../ 代表返回上一级目录;
../../ 代表返回上两级目录。
方式四:资源文件加载(企业开发/作业首选)
将图片导入项目:Properties –> Resources.resx
优点:图片直接嵌入项目内部,不属于外部文件,发布项目、更换电脑图片永不丢失,稳定性最高。
调用方式:控件.Image = Properties.Resources.图片名;
10. this.Controls.Add(l1);
-
this:指代当前Form1窗体
-
Controls:当前窗体的控件集合,所有显示在窗体上的控件全部存放在这里
-
Add():添加方法,将我们手动创建的l1添加进集合
重点:所有手写控件,必须Add,否则界面看不见!
五、常见易错点(考试/作业高频坑点)
忘记添加Controls.Add():属性全部写对,页面空白,看不到控件;
混淆ForeColor和BackColor:ForeColor改文字、BackColor改背景;
绝对路径硬编码:只能自己电脑能用,换电脑直接报错;
ARGB数值越界:四个参数必须在0~255之间;
分不清相对路径:../是上一级,写的层级不对图片加载失败。
六、课堂总结
1、动态创建控件固定三步:new实例化对象、配置各项属性、Add添加至窗体集合;
2、Label常用属性包含:Text、ForeColor、BackColor、Size、Location、TextAlign、Image;
3、颜色赋值分为:系统自带颜色、ARGB自定义颜色两种;
4、图片加载四种方式:绝对路径、@禁止转义、相对路径、资源文件;
5、正式开发优先使用资源文件加载图片,安全性最高,不会出现图片丢失问题。
WinForm TextBox文本框控件 + 自定义事件
一、知识点概述
本次课程主要学习两大核心内容:
1、动态手写创建 TextBox 文本框控件,掌握文本框所有常用属性;
2、掌握TextBox内置TextChanged内容改变事件;
3、复习自定义委托、自定义事件、事件绑定、事件触发;
4、掌握WinForm控件事件的两种使用方式。
TextBox:文本输入框,主要用于接收用户输入账号、密码、文字、数字等数据,是项目开发中使用频率最高的控件之一。
二、完整源代码
namespace _3textbox
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
//创建字体对象,设置字体为楷体
FontFamily family = new FontFamily("楷体");
//动态创建TextBox文本框控件,并初始化所有属性
TextBox t1 = new TextBox()
{
Text = "你好", //输入框默认显示文本
Font = new Font(family, 20, FontStyle.Bold), //字体、字号、加粗
Size = new Size(300, 100), //控件大小(宽,高)
Location = new Point(100, 300), //控件窗体坐标
TextAlign = HorizontalAlignment.Center, //文本水平居中
MaxLength = 10, //限制最大输入字符为10位
PasswordChar = '&' //设置密码掩码符号
};
t1.Clear(); //清空文本框里面所有文字
//给文本框绑定【内容改变事件】Lambda写法
t1.TextChanged += (sender, e) =>
{
Console.WriteLine("ccccccccccccccc");
};
//t1.Focus(); //让文本框直接获取输入焦点
//把控件添加到窗体,界面才能显示
this.Controls.Add(t1);
//给自定义事件绑定Lambda方法
Change += (a) =>
{
Console.WriteLine(a + "ssss");
MessageBox.Show(a + "sssss");
};
//手动触发自定义事件,传递参数10
Change.Invoke(10);
}
//1.自定义委托:规定事件方法格式(参数为int类型)
public delegate void MyDel(int a);
//2.根据委托创建自定义事件
public event MyDel Change;
//=====设计器拖拽控件自带的TextChanged事件=====
private void textBox1_TextChanged(object sender, EventArgs e)
{
Console.WriteLine("bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb");
}
private void textBox2_TextChanged(object sender, EventArgs e)
{
Console.WriteLine("aaaaaaaaaaaaaaaaaaaa");
}
//让指定文本框获取焦点
private void label2_Click(object sender, EventArgs e)
{
textBox4.Focus();
}
}
}
三、动态创建TextBox步骤
动态创建所有控件,固定三步:
第一步:new 实例化控件对象
第二步:给控件设置各种属性
第三步:this.Controls.Add(控件名) 添加到窗体
四、逐行代码详细解析
1、FontFamily 字体类
FontFamily family = new FontFamily("楷体");
作用:创建字体家族对象,指定当前控件使用的字体类型,例如:宋体、黑体、楷体等。
2、动态创建TextBox
TextBox t1 = new TextBox(){};
在内存中创建一个全新的空白文本框控件,此时窗体看不到控件。
3、TextBox 全部属性详解
-
Text:设置文本框默认显示的内容,也是用户输入的数据。
-
Font:设置字体样式。参数依次为:字体对象、字号、字体样式(加粗/斜体/常规)。
-
Size:控件大小,new Size(宽度,高度)。
-
Location:控件坐标,new Point(X,Y),以窗体左上角为原点。
-
TextAlign:文本对齐方式,HorizontalAlignment.Center代表水平居中。
-
MaxLength:限制文本框最大输入字符数量,防止用户输入过多内容。
-
PasswordChar:密码掩码,输入的内容全部替换为指定符号,用于密码框。
4、Clear() 清空方法
t1.Clear();
作用:清空文本框内部所有的文字内容,重置输入框。
5、TextChanged 文本改变事件(重点)
t1.TextChanged += (sender, e) =>
{
Console.WriteLine("ccccccccccccccc");
};
触发时机:只要文本框内容发生任何改变,立刻触发。
绑定方式:使用Lambda表达式快速绑定事件,不需要单独写方法。
6、Focus() 获取焦点
Focus():让指定文本框自动激活,光标直接定位到输入框内,方便用户直接输入内容。
7、添加控件到窗体
this.Controls.Add(t1);
所有手写控件必须Add添加到窗体集合,否则界面无法显示控件。
五、自定义委托与自定义事件解析
1、自定义委托
public delegate void MyDel(int a);
定义一个委托,约束回调方法:无返回值,必须接收一个int类型参数。
2、自定义事件
public event MyDel Change;
以自定义委托为类型,创建事件变量Change。
3、事件订阅
Change += (a) =>
{
Console.WriteLine(a+"ssss");
MessageBox.Show(a + "sssss");
};
给事件绑定Lambda回调方法,事件触发自动执行。
4、触发事件
Change.Invoke(10);
手动触发事件,并给订阅方法传递参数10;最终控制台打印内容 + 弹出提示框。
六、WinForm控件事件两种使用方式
WinForm系统自带控件(TextBox、Label、Button)内部已经封装好了全部事件,不需要我们自己定义事件。
方式一:界面方式(双击控件)
直接在窗体设计页面,双击TextBox,自动生成TextChanged事件方法,直接写业务代码。
方式二:代码绑定方式
控件.事件 += 方法 / Lambda表达式;适合动态创建的控件。
七、本节课知识点总结
-
1、动态创建TextBox控件分为三步:new对象、设置属性、Add添加窗体;
-
2、常用属性:Text、Font、Size、Location、MaxLength、PasswordChar;
-
3、Clear()清空文本、Focus()设置输入焦点;
-
4、TextChanged事件:文本内容一旦修改立马触发;
-
5、控件事件分两种:界面双击生成、代码+=绑定;
-
6、自定义事件三步走:定义委托、声明事件、订阅并触发事件。
八、易错点
-
1、手写控件忘记Controls.Add(),页面看不见控件;
-
2、PasswordChar设置之后,所有输入内容都会被隐藏;
-
3、TextChanged只要内容改变就触发,输入一个字符触发一次;
-
4、自定义事件只能在本类内部Invoke触发,外部无法触发。
——————Button按钮控件————————
一、知识点概述
Button(按钮)是WinForm里面最重要、最常用的交互控件。
按钮主要作用:接收用户鼠标点击,执行对应的功能代码。
本节课学习内容包含:
1、按钮常用属性:Text、Location、Enabled
2、手动动态创建按钮(手写代码,不拖拽)
3、动态绑定点击事件(Lambda匿名方法)
4、绑定已有方法、移除事件
5、事件里面两个参数 sender 和 e 的作用
6、多个按钮共享同一个点击事件
7、WinForm事件的两种使用方式
二、完整可运行源代码
namespace _4按钮
{
public partial class Form1 : Form
{
//窗体构造函数:程序运行第一个执行的方法
public Form1()
{
//初始化窗体和所有拖拽控件
InitializeComponent();
//设置按钮启用状态,true可用,false禁用变灰色
button1.Enabled = true;
//==================第一步:创建按钮对象==================
Button btn = new Button()
{
Text = "OK", //设置按钮显示文字
Location = new Point(30, 100) //设置按钮坐标X,Y
};
//==================第二步:绑定点击事件(Lambda)==================
//Click:鼠标单击事件
btn.Click += (sender, e) =>
{
//弹出消息提示框
MessageBox.Show("我点击btn");
};
//==================第三步:绑定已存在的事件方法==================
//同一个事件可以绑定多个函数,点击全部执行
btn.Click += button1_Click;
//==================移除事件(减法)==================
//btn.Click -= button1_Click;
//==================第四步:把控件添加到窗体==================
this.Controls.Add(btn);
}
/// <summary>
/// 按钮共用的点击事件方法
/// </summary>
/// <param name="sender">触发事件的控件对象</param>
/// <param name="e">事件参数</param>
private void button1_Click(object sender, EventArgs e)
{
//sender默认是object类型,需要强制转换成Button类型
Button tempBtn = (Button)sender;
//将被点击按钮的文字赋值给label
label1.Text = tempBtn.Text;
}
}
}
三、动态创建控件固定四大步骤(必考简答题)
不管是Label、TextBox、Button,所有控件动态创建全部固定4步:
第一步:new 实例化控件对象(在内存创建控件)
第二步:给控件设置相关属性(文字、大小、坐标)
第三步:根据需求绑定对应的事件(点击、输入、加载)
第四步:this.Controls.Add(控件名) 添加到窗体显示
注意:少第四步,控件永远看不见!
四、逐行代码超详细解析
1、InitializeComponent();
作用:初始化窗体,加载设计器里面所有拖拽的控件,读取界面布局。
注意:所有窗体项目必须保留,绝对不能删除。
2、Enabled 属性
button1.Enabled = true;
Enabled 用来控制按钮是否能被点击。
true:按钮正常状态,可以点击(默认)
false:按钮变成灰色,禁用状态,无法点击、无法触发事件
3、动态创建按钮对象
Button btn = new Button()
{
Text = "OK",
Location = new Point(30, 100)
};
Button btn = new Button():在内存中创建一个全新空白按钮。
Text:设置按钮表面显示的文字内容。
Location:设置按钮在窗体的坐标。
坐标规则:窗体左上角为原点(0,0),X向右增加,Y向下增加。
4、Click 点击事件
Click是按钮最核心事件:鼠标左键单击按钮的一瞬间触发。
事件绑定符号:
+= :给控件绑定事件(加法)
-= :移除已经绑定的事件(减法)
同一个按钮可以绑定多个事件方法,点击时从上到下全部执行。
5、Lambda匿名事件
btn.Click += (sender, e) =>
{
MessageBox.Show("我点击btn");
};
Lambda作用:快速绑定简单事件,不用单独写一个方法。
MessageBox.Show("内容"):弹出弹窗提示用户。
6、绑定外部已有方法
btn.Click += button1_Click;
把我们写好的 button1_Click 方法绑定给按钮。
好处:多个按钮可以共用同一个点击方法,减少冗余代码。
7、移除事件
//btn.Click -= button1_Click;
使用 -= 可以解除按钮和方法之间的绑定,解除之后点击按钮不再执行该方法。
8、添加控件到窗体
this.Controls.Add(btn);
his:代表当前Form1窗体。
Controls:窗体的控件集合,所有能看见的控件全部存放在集合里面。
Add:把控件添加进集合,添加之后界面才能显示按钮。
五、事件参数详解(考试必考重点)
private void button1_Click(object sender, EventArgs e)
{
label1.Text = ((Button)sender).Text;
}
1、sender 参数
含义:到底是谁触发了这个点击事件,指向被点击的控件。
类型:object(所有类的父类),无法直接使用控件属性。
所以必须强制类型转换:(Button)sender
作用:实现多按钮共享同一个事件方法,简化代码。
2、e 参数
EventArgs:事件参数,用来存储事件附带的数据。
普通单击事件没有额外数据,一般不需要使用;
如果是鼠标移动、键盘按下事件,e里面会包含坐标、按键信息。
六、WinForm事件的两种写法
方式一:设计器方式(拖拽控件专用)
直接双击按钮,系统自动生成Click事件方法,直接写代码即可。
方式二:代码绑定方式(动态控件专用)
语法:控件.事件 += 方法 / Lambda
适合所有手写动态创建的控件,灵活度更高。
七、知识点总结
-
1、动态创建按钮四步:new对象、设置属性、绑定事件、Add添加;
-
2、Text修改按钮文字,Location修改按钮坐标;
-
3、Enabled控制按钮是否禁用,false变灰无法点击;
-
4、Click为单击事件,+=绑定事件,-=移除事件;
-
5、sender代表触发事件的控件,必须强制转换类型;
-
6、多个按钮可以共用同一个事件方法,提高代码复用性。
八、常见易错点
-
1、动态创建控件忘记Controls.Add(),页面空白看不到控件;
-
2、直接使用sender.Text报错,没有做强制类型转换;
-
3、分不清 += 和 -=,加法绑定、减法移除;
-
4、按钮被Enabled=false禁用后,任何事件都不会触发;
-
5、同一个事件可以绑定多个方法,执行顺序从上往下。


