Winform自定义控件之复合控件
winform提供了很多控件供使用,如label;text;button;panel;checkbox等,在一些场景下,这些控件不能很好的满足使用或适应场景,就需要我们进行自定义控件。
自定义控件有三种形式:
1.组合控件:将vs提供的控件自定义组合打包成一个新的控件就叫做组合控件。可避免一些重复工作代码,这个很好理解不赘述。继承自userControl;
2.扩展控件:例如你需要Button基础上能够支持圆角,这就需要对已有的Button控件进行扩展。继承自Button(或其他需要扩展的控件)
3.自定义控件:完全地自己绘制的控件,继承自Control;
记录最简单也最常用的组合控件:
首先右击项目->添加->用户控件;或者 右击项目->添加->类->选择用户控件。点击确定。
将自己需要的控件比如按钮,label等拖入复合控件,如下图。
然后为组合控件添加事件逻辑:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | public partial class UserControl1 : UserControl { private string name = "" ; //定义名称 public UserControl1( string name) { InitializeComponent(); label1.Text = name; this .name = name; } public event Action< string > btnClick; //添加button Click Event private void button1_Click( object sender, EventArgs e) {<br> label1.Text = "click " + DateTime.Now.Second; btnClick(name); //调用button点击Event } } |
逻辑完成后,生成解决方案,此时可以在工具箱中看到UserControl1,像使用其他控件一样,直接拖动使用即可。
下面验证下刚才创建的组合控件UserControl1:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | public Form1() { InitializeComponent(); InitControl(); //Form的构造函数 } private void InitControl() { UserControl1 uc1 = new UserControl1( "ucNo.1" ); UserControl1 uc2 = new UserControl1( "ucNo.2" ); UserControl1 uc3 = new UserControl1( "ucNo.3" ); //创建3个UserControl1实例。 this .panel1.Controls.Add(uc1); this .panel1.Controls.Add(uc2); this .panel1.Controls.Add(uc3); //添加到Panel中 uc1.Location = new Point(0, 0); uc2.Location = new Point(uc1.Size.Width + 10, 0); uc3.Location = new Point(uc1.Size.Width * 2 + 20, 0); //设定位置坐标 uc1.BackColor = Color.Orange; uc2.BackColor = Color.Orchid; uc3.BackColor = Color.PaleGreen; //设定背景颜色 uc1.btnClick += ucBtnClick; uc2.btnClick += ucBtnClick; uc3.btnClick += ucBtnClick; //绑定UserControl1的按钮的点击事件 } private void ucBtnClick( string name) { label1.Text = name + " Click at " + DateTime.Now.ToString( "HHmmss" ); //点击按钮时在Label中显示名称和时间 } |
下面运行看下效果:
在日常工作中,当需要UI界面显示多个同类型对象的状态时,可以使用组合控件有效避免重复代码,符合面向对象的封装的特性。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)