C#知识|事件集中响应,多个按钮关联同一事件(实例练习)

哈喽,你好,我是雷工!

本节学习窗体Controls集合、控件事件的统一关联及如何优化重复代码。

01 事件集中响应

原理:就是相同的控件,可以关联同一个事件响应方法。

02 示例演示

2.1、示例功能

该示例实现窗体中选择喜欢的账号,然后弹出该账号的编号和文章数量,即对应按钮的Tag属性对应的字符串;

2.2、效果演示

2.3、实现步骤

2.3.1、创建窗体

首先创建窗体,在窗体上布局所需的控件,将按钮的Text属性改成对应的账号名称;

可以根据喜好修改文本和背景的颜色样式。

也可以添加效果,比如当鼠标移入时显示一种颜色,点击时显示一种颜色;

2.3.2、修改添加按钮的名称

2.3.3、修改Tag属性

Tag属性可以用来存储数据,该示例将每个账号按钮对应的编号和文章数量存储在Tag属性中;

实际项目中获取到对应数据后可以再做相应处理,此示例仅显示出来;

2.3.4、事件集中处理方法

代码:

csharp 复制代码
//事件集中处理方法
private void btn_Click(object sender, EventArgs e)
{
    Button btn = sender as Button;
    MessageBox.Show(btn.Tag.ToString());//显示按钮Tag属性对应的字符串
}

2.3.5、事件关联

多个按钮响应同一个事件,需要通过如下代码实现事件关联;

事件关联写法1:

csharp 复制代码
//多个按钮响应同一个事件,在此做事件关联(写法1)-
this.btn001.Click += new System.EventHandler(this.btn_Click);
this.btn002.Click += new System.EventHandler(this.btn_Click);
this.btn003.Click += new System.EventHandler(this.btn_Click);
this.btn004.Click += new System.EventHandler(this.btn_Click);
this.btn005.Click += new System.EventHandler(this.btn_Click);
this.btn006.Click += new System.EventHandler(this.btn_Click);
this.btn007.Click += new System.EventHandler(this.btn_Click);
this.btn008.Click += new System.EventHandler(this.btn_Click);
this.btn009.Click += new System.EventHandler(this.btn_Click);
this.btn010.Click += new System.EventHandler(this.btn_Click);
this.btn011.Click += new System.EventHandler(this.btn_Click);
this.btn012.Click += new System.EventHandler(this.btn_Click);

如上写法1比较容易理解,即将每个按钮都关联2.3.4所示的时间集中处理方法;

该写法虽然也能实现要实现的效果,但是较重复,本例为12个按钮关联同一事件,实际开发中如果遇到几十上百个按钮关联同一事件的话,按上方写法就比较麻烦了,所以可以通过如下写法优化写法1的代码:

事件关联写法2:

csharp 复制代码
//多个按钮响应同一个事件,在此做事件关联(写法2)
foreach (Control item in this.Controls)
{
    if(item is Button)
    {
        Button btn = item as Button;
        if(btn.Tag.ToString()!="save")//过滤保存按钮;
        {
            btn.Click += new System.EventHandler(this.btn_Click);
        }
    }
}

写法2相比写法1明显高级很多,当一个窗体有上百个按钮时,也不用修改代码,不仅看起来简洁,维护起来也比较方便。

2.4、后记

以上为学习事件集中使用方法的一个小的练习示例,有同样在学习C#的小伙伴也可以尝试下。

相关推荐
阳光_你好7 分钟前
解决用git bash终端 tail -f 命令查看日志中文乱码问题
开发语言·git·bash
nlog3n8 分钟前
Java 原型模式 详解
java·开发语言·原型模式
观无10 分钟前
关于跨域与.NET的处理方案
c#
全栈小514 分钟前
【C#】.net core 6.0 依赖注入常见问题之一,在构造函数使用的类,都需要注入到容器里,否则会提示如下报错,让DeepSeek找找原因,看看效果
c#·.netcore·依赖注入·deepseek
能来帮帮蒟蒻吗1 小时前
Go语言学习(15)结构体标签与反射机制
开发语言·笔记·学习·golang
陈皮话梅糖@3 小时前
使用 Provider 和 GetX 实现 Flutter 局部刷新的几个示例
开发语言·javascript·flutter
hvinsion4 小时前
基于PyQt5的自动化任务管理软件:高效、智能的任务调度与执行管理
开发语言·python·自动化·自动化任务管理
Aphelios3804 小时前
Java全栈面试宝典:线程机制与Spring IOC容器深度解析
java·开发语言·jvm·学习·rbac
qq_529835355 小时前
装饰器模式:如何用Java打扮一个对象?
java·开发语言·装饰器模式
日暮南城故里5 小时前
Java学习------源码解析之StringBuilder
java·开发语言·学习·源码