C# WinForm遍历窗体控件的3种方法

摘要:
C#WinForm遍历窗体控件的3种方法转https://www.cnblogs.com/zhaoshujie/p/14638460.html1.循环遍历privatevoidGetControls(ControlfatherControl){Control.ControlCollectionsonControls=fatherControl.Controls;foreach(Controlcon
C# WinForm遍历窗体控件的3种方法
转 https://www.cnblogs.com/zhaoshujie/p/14638460.html

1.循环遍历

private void GetControls(Control fatherControl)
{
    Control.ControlCollection sonControls = fatherControl.Controls;
    foreach (Control control in sonControls)
    {
        listBox1.Items.Add(control.Name);
    }
}

结果:能获取到Panel、GroupBox、TabControl等控件
问题:Panel等控件上面的子控件获取不到

2.递归遍历

private void GetControls(Control fatherControl)
{
    Control.ControlCollection sonControls = fatherControl.Controls;
    foreach (Control control in sonControls)
    {
        listBox1.Items.Add(control.Name);
        if (control.Controls != null)
        {
            GetControls(control);
        }
    }
}

结果:能获取到绝大多数控件
问题:Timer、ContextMenuStrip等控件获取不到

3.使用反射

private void GetControls(Control fatherControl)
{
    System.Reflection.FieldInfo[] fieldInfo = this.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Instance);
    for (int i = 0; i < fieldInfo.Length; i++)
    {
        listBox1.Items.Add(fieldInfo[i].Name);
    }
}

结果:所有控件都被获取到了

DevExpress控件无法使用this.Controls进行遍历,只能通过反射的方法获得,如下代码:

public void SearchBarManager()
{
    Type FormType = this.GetType();
    FieldInfo[] fi = FormType.GetFields(BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public);
    foreach (FieldInfo info in fi)
    {
        if (info.FieldType == typeof(DevExpress.XtraBars.BarManager))
        {
            DevExpress.XtraBars.BarManager bar = (info.GetValue(this)) as DevExpress.XtraBars.BarManager;
            foreach (DevExpress.XtraBars.BarItem bi in bar.Items)
            {
                MessageBox.Show(bi.Name);
            }
        }
    }
}

免责声明:文章转载自《C# WinForm遍历窗体控件的3种方法》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇C#多线程和异步(一)——基本概念和使用方法Oracle SQL获取每个分组中日期最大的一条数据下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

c#遍历Dictionary

Dictionary<string, string> dic = new Dictionary<string, string>(); foreach (KeyValuePair<string, string> kvp in dic ) { Console.Write(kvp.Key); Console.Write(kvp...

lua中table的遍历,以及删除

Lua 内table遍历 在lua中有4种方式遍历一个table,当然,从本质上来说其实都一样,只是形式不同,这四种方式分别是: 1. ipairs for index, value in ipairs(table) do end 注:这种方式的遍历只会从key为1的地方开始,一直以key递增1的顺序来遍历,若找到一个递增不是1的key就结束遍历,无论后面...

C# winform在WebBrowser下获取完整的Cookies(包括含HTTPOnly属性的)

利用wininet获取网页Cookie 模拟post请求取数据,使用普通的Cookies无法获取完整的Cookies信息 只能获取了一部分 ,导致取回来的是重新登陆的页面。 后来经过不懈的精神,终于找到了方法实现获取HTTPOnly。 WinInet WinInet(“Windows Internet”)API帮助程序员使用三个常见的Internet协议,...

go跳出多层循环的几种方式

前言 比如这样的需求, 遍历一个 切片, 切片内容是切片1, 需求是判断切片1中某个是否有相应数据, 有就返回 正文 我们需要考虑的是在写两层遍历时如何在获取结果后结束这两层遍历 变量法 设置一个变量, 在外层监听该变量, 获取到结果后修改该变量 func main() { t := [][]int{{1, 2, 3, 4, 5}, {5, 6, 7,...

数组以及数组常用方法

1.什么是数组? 数组就是专门用来存储一组数据的 它不属于基本数据类型,这是初学者经常会犯的错误,基本数据类型在ES6之前只有Number/String/Boolean/Null/undefined 数组属于引用数据类型(对象类型) 2.如何创建数组? 第一种是通过new的方法创建一个数组的对象 let 变量名称 = new Array(数组长度); 第二...

Winform DataGridView CheckBoxColumn c# 单选 解决方案

这个问题由来已久,我最近在工作中也遇到了这个问题,不过属于这个问题比较简单初级的涉及。 发现网上对这个问题的解决方案很多不对,答非所问。 所以这里将我测试成功的解决方案记录下来。 首先,DataGridView CheckBoxColumn 默认是可以多选,不能单选的。 所以无法通过设置来解决,必须通过代码自己控制。 而具体使用哪个事件,哪种逻辑也有很...