C# 动态管理控件和事件,批量查询管理同类控件

发布于:2025-06-13 ⋅ 阅读:(22) ⋅ 点赞:(0)

代码功能总结

这段代码是一个 C# Windows Forms 应用中的事件处理函数,用于响应数值选择器(NumericUpDown)控件的值变化。其核心功能是根据用户选择的数据长度,动态管理 64 个文本框的启用状态和事件处理器。

关键功能点

  1. 数据长度计算

    • 根据 DLC(数据长度代码)和 CAN FD 模式选项计算实际数据长度
    • 使用辅助方法GetLengthFromDLC处理不同模式下的长度转换
  2. 控件动态管理

    • 通过控件名称动态查找 64 个文本框控件(txtData0 到 txtData63)
    • 使用递归查找确保能找到嵌套在容器中的控件
  3. 启用状态控制

    • 仅启用索引小于实际数据长度的文本框
    • 实现了根据数据长度动态显示 / 隐藏输入字段的功能
  4. 事件处理器管理

    • 使用 "移除 - 添加" 模式避免事件重复注册
    • 所有文本框共享相同的输入验证逻辑(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 事件处理器
	}
}