获取特定类型的所有控件

时间:2011-01-07 21:18:45

标签: c# .net winforms

我有多个图片框,我需要在运行时加载随机图像。因此我认为拥有所有图片框的集合然后使用简单的循环将图像分配给它们会很好。但是我应该怎么做呢?或许还有其他更好的解决方案可以解决这个问题吗?

8 个答案:

答案 0 :(得分:73)

使用一点LINQ:

foreach(var pb in this.Controls.OfType<PictureBox>())
{
  //do stuff
}

但是,这只会处理主容器中的PictureBox。

答案 1 :(得分:25)

您可以使用此方法:

public static IEnumerable<T> GetControlsOfType<T>(Control root)
    where T : Control
{
    var t = root as T;
    if (t != null)
        yield return t;

    var container = root as ContainerControl;
    if (container != null)
        foreach (Control c in container.Controls)
            foreach (var i in GetControlsOfType<T>(c))
                yield return i;
}

然后你可以这样做:

foreach (var pictureBox in GetControlsOfType<PictureBox>(theForm)) {
    // ...
}

答案 2 :(得分:7)

如果您至少使用.NET 3.5,那么您拥有LINQ,这意味着,由于ControlCollection实现了IEnumerable,您可以这样做:

var pictureBoxes = Controls.OfType<PictureBox>();

答案 3 :(得分:3)

我使用这种通用的递归方法:

这种方法的假设是,如果控件是T,则该方法不会查看其子项。如果你还需要看看它的孩子,你可以很容易地改变它。

public static IList<T> GetAllControlsRecusrvive<T>(Control control) where T :Control 
{
    var rtn = new List<T>();
    foreach (Control item in control.Controls)
    {
        var ctr = item as T;
        if (ctr!=null)
        {
            rtn.Add(ctr);
        }
        else
        {
            rtn.AddRange(GetAllControlsRecusrvive<T>(item));
        }

    }
    return rtn;
}

答案 4 :(得分:2)

    public static List<T> FindControlByType<T>(Control mainControl,bool getAllChild = false) where T :Control
    {
        List<T> lt = new List<T>();
        for (int i = 0; i < mainControl.Controls.Count; i++)
        {
            if (mainControl.Controls[i] is T) lt.Add((T)mainControl.Controls[i]);
            if (getAllChild) lt.AddRange(FindControlByType<T>(mainControl.Controls[i], getAllChild));
        }
        return lt;
    }

答案 5 :(得分:2)

一个简单的函数,易于理解,递归,并且可以在任何表单控件中调用它:

private void findControlsOfType(Type type, Control.ControlCollection formControls, ref List<Control> controls)
    {
        foreach (Control control in formControls)
        {
            if (control.GetType() == type)
                controls.Add(control);
            if (control.Controls.Count > 0)
                findControlsOfType(type, control.Controls, ref controls);
        }
    }

您可以通过多种方式调用它。 获得按钮:

List<Control> buttons = new List<Control>();
findControlsOfType(typeof(Button), this.Controls, ref buttons);

获取小组:

List<Control> panels = new List<Control>();
findControlsOfType(typeof(Panel), this.Controls, ref panels);

答案 6 :(得分:0)

这对我来说是迄今为止最容易的。在我的应用程序中,我试图清除面板中的所有文本框:

    foreach (Control c in panel.Controls)
    {
        if (c.GetType().Name == "TextBox")
        {
            c.Text = "";
        }
    }

答案 7 :(得分:0)

将“控制”作为容器考虑在内:

        private static IEnumerable<T> GetControlsOfType<T>(this Control root)
        where T : Control
    {
        if (root is T t)
            yield return t;

        if (root is ContainerControl || root is Control)
        {
            var container = root as Control;
            foreach (Control c in container.Controls)
                foreach (var i in GetControlsOfType<T>(c))
                    yield return i;
        }
    }