1.全局控件遍历
实现了一个通用函数EnumerateAllControls
, 它可以遍历指定窗体或容器内的所有控件,打印出每个控件的名称和类型。
private void EnumerateAllControls(Control parent)
{foreach (Control control in parent.Controls){Console.WriteLine($"Control Name: {control.Name}, Type: {control.GetType().Name}");if (control.HasChildren) EnumerateAllControls(control);}
}
- 调用方式:通过
ReadAllWindowsControls
方法启动全局遍历。
public void ReadAllWindowsControls() => EnumerateAllControls(this);
2.定向搜索与修改
为了针对类型为ModbusWareHouseOneControl
的控件及其内部的特定标签label1
进行特殊处理,我们定义了一个名为EnumerateSubControlsOfModbus
的函数。它遍历给定父控件的所有子控件,当找到ModbusWareHouseOneControl
类型的控件时,会进一步对其子控件进行深度遍历。
private void EnumerateSubControlsOfModbus(Control parent)
{foreach (Control control in parent.Controls){if (control is ModbusWareHouseOneControl){Console.WriteLine($"Control Name: {control.Name}, Type: {control.GetType().Name}");EnumerateAllControls(control); // 专注于该特定类型控件的子控件遍历}}
}
EnumerateAllControls
是一个辅助函数,递归地处理每个找到的子控件,它的任务包括查找并修改名称为label1
的控件文本,以及根据你的需求改变自定义的 垂直进度条(verticalProgressBar1
)的颜色。(这里举例系统控件label和和自定义控件verticalProgressBar1的属性修改方法
)。
private void EnumerateAllControls(Control control)
{Console.WriteLine($"Control Name: {control.Name}, Type: {control.GetType().Name}");if (control.HasChildren){foreach (Control child in control.Controls){if (child.Name == "label1"){child.Text = "修改的值";break; // 修改后可根据需要选择是否继续遍历} else if (child.Name == "verticalProgressBar1"){((VerticalProgressBar.VerticalProgressBar)child).Color = Color.Red; // 修改颜色}EnumerateAllControls(child);}}
}public void StartTraversal(Control startingPoint)
{// 开始于指定的起点,通常是应用的主窗体EnumerateSubControlsOfModbus(startingPoint);
}// 使用场景,在窗体初始化或其他适当位置启动遍历
StartTraversal(this);