C# 动态管理控件和事件,批量查询管理同类控件
代码功能总结
这段代码是一个 C# Windows Forms 应用中的事件处理函数,用于响应数值选择器(NumericUpDown)控件的值变化。其核心功能是根据用户选择的数据长度,动态管理 64 个文本框的启用状态和事件处理器。
关键功能点
-
数据长度计算:
- 根据 DLC(数据长度代码)和 CAN FD 模式选项计算实际数据长度
- 使用辅助方法
GetLengthFromDLC
处理不同模式下的长度转换
-
控件动态管理:
- 通过控件名称动态查找 64 个文本框控件(txtData0 到 txtData63)
- 使用递归查找确保能找到嵌套在容器中的控件
-
启用状态控制:
- 仅启用索引小于实际数据长度的文本框
- 实现了根据数据长度动态显示 / 隐藏输入字段的功能
-
事件处理器管理:
- 使用 "移除 - 添加" 模式避免事件重复注册
- 所有文本框共享相同的输入验证逻辑(KeyPress 事件)
- 所有文本框共享相同的焦点离开处理逻辑(Leave 事件)
代码设计亮点
- 动态控件查找:避免了为 64 个文本框编写重复代码
- 事件安全注册:通过先移除再添加的方式防止事件重复绑定
- 健壮性处理:包含了控件存在性检查和类型转换验证
// 数据长度变化事件处理函数
private void nudLength_ValueChanged(object sender, EventArgs e)
{int iLength = GetLengthFromDLC((int)nudLength.Value, !chbFD.Checked); // 获取数据长度,考虑是否为FD模式for (int i = 0; i < 64; i++) // 循环遍历 64 个文本框控件{string controlName = "txtData" + i.ToString(); // 控件名称格式为 txtData0, txtData1, ..., txtData63//通过控件名称查找对应的文本框控件,使用递归查找模式 (true) 确保能找到嵌套在容器控件中的文本框Control[] foundControls = this.Controls.Find(controlName, true); if (foundControls.Length == 0) continue; // 如果没有找到对应的控件则跳过当前循环TextBoxControl txtBox = foundControls[0] as TextBoxControl; // 确保找到的控件是 TextBox 类型if (txtBox == null) continue; // 如果不是 TextBox 类型则跳过// 设置启用状态txtBox.Enabled = i < iLength; // 仅当 i 小于 iLength 时启用文本框// 添加 KeyPress 事件(自动去重) txtBox.KeyPress -= txtID_KeyPress; // 先移除确保不重复txtBox.KeyPress += txtID_KeyPress; // 添加 KeyPress 事件处理器// 添加 Leave 事件(自动去重) txtBox.Leave -= txtData0_Leave; // 先移除确保不重复txtBox.Leave += txtData0_Leave; // 添加 Leave 事件处理器}
}