表单对象和循环遍历c#中的对象?

Joo*_*ooj 2 .net c# object winforms

我有一个主要表单(frmMain),有一些按钮(button1, button2...).

然后我这样做:

object objectsContainer = frmMain; // <--now the object contains form base, button1, button2...
Run Code Online (Sandbox Code Playgroud)

我怎么能循环遍历我的对象中的所有包含项目来访问butto1,button2 ...... ???

我这样做了,但这不是我想要的.

foreach (PropertyInfo pInfo in objectsContainer.GetType().GetProperties())     
{

}
Run Code Online (Sandbox Code Playgroud)

我想做这样的事情:

foreach (object objectFromForm in objectsContainer)     // <--- how to do this looping an object (type of form)
{
    //here is objectFromForm = base, button1, button2...
    foreach (PropertyInfo pInfo in objectFromForm .GetType().GetProperties())     
    {
               //here it's possible to access pInfo and its properties like size, name ...
    }
}
Run Code Online (Sandbox Code Playgroud)

当我调试并查看objectsContainer的内容时,我想要所有"信息".

一些建议?

最好的祝福.

**

更新:

**

好的,我做了一个测试项目.在那里你可以看到我想做什么.在项目中是一个带有对象的图像......在这里你可以下载它:http: //www.mediafire.com/download.php?k5j3ejnzm2

最好的祝福.

Mar*_*ell 20

每个Control都有一个Controls集合,您可以迭代以获得完整的层次结构,但不幸的是ToolStrip项目使用不同的对象模型(它们不是全部Control); 因此,您可以迭代这样的设置(也包括菜单项),但这不是微不足道的; 这是一个例子:

    IEnumerable RecurseObjects(object root) {
        Queue items = new Queue();
        items.Enqueue(root);
        while (items.Count > 0) {
            object obj = items.Dequeue();
            yield return obj;
            Control control = obj as Control;
            if (control != null) {
                // regular controls and sub-controls
                foreach (Control item in control.Controls) {
                    items.Enqueue(item);
                }
                // top-level menu items
                ToolStrip ts = control as ToolStrip;
                if (ts != null) {
                    foreach(ToolStripItem tsi in ts.Items) {
                        items.Enqueue(tsi);
                    }
                }
            }
            // child menus
            ToolStripDropDownItem tsddi = obj as ToolStripDropDownItem;
            if (tsddi != null && tsddi.HasDropDownItems) {
                foreach (ToolStripItem item in tsddi.DropDownItems) {
                    items.Enqueue(item);
                }
            }
        }            
    }
Run Code Online (Sandbox Code Playgroud)

你可以这样称呼,例如,通过以下方式:

    foreach (object obj in RecurseObjects(this)) {
        Console.WriteLine(obj);
    }
Run Code Online (Sandbox Code Playgroud)

当然,问题是:你想对每件物品做什么?

  • @behrooz - 它****使用`yield return`; 它不*做的是在堆栈上自我递归以获得子控件,这实际上可能非常浪费. (3认同)
  • 令人印象深刻的使用队列. (2认同)

Adr*_*der 13

您可以循环ControlCollection.

请记住,如果这些控件位于面板中,则可以嵌套这些控件.

private void RecusiceControls(ControlCollection controls)
        {
            foreach (Control control in controls)
            {
                RecusiceControls((ControlCollection)control.Controls);
                if (control is Button)
                {
                }
            }
        }
Run Code Online (Sandbox Code Playgroud)

看看这个

在C#中递归查找控件