如何根据控件名称在指定父容器中查找控件位置
实现思路&代码示例
核心逻辑说明
你需要的功能可以按「参数校验→查找目标控件→返回对应坐标」的流程实现,可根据需求选择只查找直接子控件或者递归查找所有嵌套层级的子控件,坐标类型也可以按需选择相对父容器坐标/屏幕绝对坐标。
具体实现步骤
- 第一步:参数合法性校验,避免空引用异常
传入的控件名为空、父容器为空的场景下直接返回Point.Empty,调用方可通过Point.IsEmpty判断是否查找成功 - 第二步:遍历父容器的
Controls集合,按Name属性匹配目标控件
可自行决定是否要区分名称的大小写,默认不区分大小写适配大多数场景 - 第三步:坐标转换(按需选择)
- 要目标控件相对父容器左上角的坐标:直接返回控件的
Location属性即可 - 要目标控件屏幕绝对坐标:调用控件的
PointToScreen方法转换即可
- 要目标控件相对父容器左上角的坐标:直接返回控件的
- 第四步(可选):递归查找嵌套控件
如果父容器内还有Panel、GroupBox等容器类子控件,需要遍历子控件的Controls集合递归查找
完整代码实现
下面是支持递归查找、默认返回相对父容器坐标的实现:
private Point FindControlLocation(string ControlName, Control ParentControl) { // 参数校验 if (string.IsNullOrEmpty(ControlName) || ParentControl == null) { return Point.Empty; } // 遍历当前父容器的所有子控件 foreach (Control ctl in ParentControl.Controls) { // 匹配控件名(不区分大小写) if (ctl.Name.Equals(ControlName, StringComparison.OrdinalIgnoreCase)) { // 返回相对父容器的坐标 return ctl.Location; // 如果要返回屏幕绝对坐标,把上面一行换成下面的代码即可 // return ctl.PointToScreen(new Point(0, 0)); } // 当前子控件是容器,递归查找 if (ctl.HasChildren) { Point nestedLocation = FindControlLocation(ControlName, ctl); if (!nestedLocation.IsEmpty) { // 递归查到的是相对当前子容器的坐标,转成相对最外层父容器的坐标 return new Point(ctl.Left + nestedLocation.X, ctl.Top + nestedLocation.Y); // 如果要返回屏幕绝对坐标,直接返回nestedLocation即可,不需要额外计算 } } } // 没找到目标控件 return Point.Empty; }
注意事项
- 如果存在多个同名控件,方法会返回遍历到的第一个符合条件的控件坐标
- 如果需要区分控件名大小写,把
StringComparison.OrdinalIgnoreCase改成StringComparison.Ordinal即可
内容的提问来源于stack exchange,提问作者user17323352
相关产品推荐
相关产品推荐

