Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 获取特定类型的所有控件_C#_.net_Winforms - Fatal编程技术网

C# 获取特定类型的所有控件

C# 获取特定类型的所有控件,c#,.net,winforms,C#,.net,Winforms,我有多个PictureBox,我需要在运行时将随机图像加载到其中。所以我认为最好是收集所有PictureBox,然后使用一个简单的循环将图像分配给它们。但是我该怎么做呢?或者可能还有其他更好的解决方案吗?使用一点LINQ: foreach(var pb in this.Controls.OfType<PictureBox>()) { //do stuff } foreach(this.Controls.OfType()中的var pb) { //做事 } 但是,这将只处理主容

我有多个PictureBox,我需要在运行时将随机图像加载到其中。所以我认为最好是收集所有PictureBox,然后使用一个简单的循环将图像分配给它们。但是我该怎么做呢?或者可能还有其他更好的解决方案吗?

使用一点LINQ:

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

但是,这将只处理主容器中的图片盒。

您可以使用以下方法:

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;
}
公共静态IEnumerable GetControlSoftType(控件根)
其中T:控制
{
var t=根作为t;
如果(t!=null)
收益率t;
var container=根作为container控件;
if(容器!=null)
foreach(container.Controls中的控件c)
foreach(GetControlSoftType(c)中的var i)
收益率i;
}
然后你可以这样做:

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

如果您至少在.NET 3.5上,那么您就有了LINQ,这意味着既然
ControlCollection
实现了
IEnumerable
,您就可以:

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

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

该方法的假设是,如果控件为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;
}
公共静态IList GetAllControlsRecurve(控件控件),其中T:Control
{
var rtn=新列表();
foreach(Control.Controls中的控制项)
{
var ctr=作为T的项目;
如果(ctr!=null)
{
rtn.Add(ctr);
}
其他的
{
rtn.AddRange(GetAllControlsRecurve(项目));
}
}
返回rtn;
}
公共静态列表FindControlByType(Control mainControl,bool getAllChild=false),其中T:Control
{
列表lt=新列表();
对于(int i=0;i
这里是另一个版本,因为现有的版本不是我想要的。这个方法可以作为一个扩展方法(可选),它不包括检查根/父容器的类型。此方法基本上是一种“获取T类型的所有子控件”方法:

public static System.Collections.Generic.IEnumerable ControlsOfType(this System.Web.UI.Control控件),其中T:System.Web.UI.Control{
foreach(Control.Controls中的System.Web.UI.Control-childControl){
如果(childControl为T)收益率(T)childControl;
foreach(childControl.ControlsOfType()中的var-futuredgenderantcontrol)产生返回futuredgenderantcontrol;
}
}

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

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);
        }
    }
private void findControlsOfType(类型类型,Control.ControlCollection formControls,ref List controls)
{
foreach(formControls中的控件)
{
if(control.GetType()==type)
控件。添加(控件);
如果(control.Controls.Count>0)
FindControlSoftType(类型、控件.控件、引用控件);
}
}
您可以通过多种方式调用它。 要获取按钮,请执行以下操作:

List<Control> buttons = new List<Control>();
findControlsOfType(typeof(Button), this.Controls, ref buttons);
列表按钮=新建列表();
FindControlSoftType(typeof(Button)、this.Controls、ref buttons);
要获取面板,请执行以下操作:

List<Control> panels = new List<Control>();
findControlsOfType(typeof(Panel), this.Controls, ref panels);
列表面板=新列表();
FindControlSoftType(面板的类型)、this.Controls、ref面板);

等等。

这对我来说是最简单的。在我的应用程序中,我试图清除面板中的所有文本框:

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

将控件作为容器考虑在内:

        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;
        }
    }
私有静态IEnumerable GetControlSoftType(此控件根)
其中T:控制
{
if(根为T)
收益率t;
if(root是ContainerControl | | root是Control)
{
var容器=根作为控制;
foreach(container.Controls中的控件c)
foreach(GetControlSoftType(c)中的var i)
收益率i;
}
}

< /代码>这将不考虑嵌套在其他容器中的PICTICBOX。OrthAccess(PigTimeBox PB在这个.Fr.ObjyType()中){//do-task}不确定它是否有很大区别,但我倾向于明确声明。对于这样的事情,这将不考虑嵌套在其他容器中的PrimeBox。在我的辩护中,OP没有具体说明这是否是一项要求;但是,还是应该这样对待它。我认为这实际上比只使用
root.Controls.of type
更冗长。哦,我明白了,你让它深入到了无限的深度。明白了,我也在做类似的事情。我尝试了这个答案的方法,但是
Control
System.Web.UI
System.Windows.Forms
之间成了一个模棱两可的参考。我只能在表单名称空间中找到
ContainerControl
,而不能在Web下找到。ContainerControl不接受Web.UI控件。还有其他人遇到过这个问题吗?(我现在要解决我的问题,但我真的很想使用这个简单而优雅的答案。)奇怪的是,
Panel
并没有继承自
ContainerControl
,我必须在Winforms类层次结构中向上一级,使用
ScrollableControl
,才能包含Panel。我还不确定这可能会导致什么其他问题。我可能会更新为只支持我正在寻找的容器。@CodeswithHammer我认为不是正确的解决方案(链接的解决方案),因为枚举不过滤
    foreach (Control c in panel.Controls)
    {
        if (c.GetType().Name == "TextBox")
        {
            c.Text = "";
        }
    }
        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;
        }
    }