【问题标题】:Foreach Every Control on all formsForeach 对所有表单的每个控件
【发布时间】:2013-03-12 13:23:36
【问题描述】:

我想manipulate我的form内的所有Controls使用foreach loop,我目前使用的是以下方法:

 foreach (Control c in this.Controls)
 {
                ComponentResourceManager resourceManager = new ComponentResourceManager(typeof(Main));
                resourceManager.ApplyResources(c, c.Name, new CultureInfo(lang));
  }

这个foreach 的问题在于Containers 中的控件不包括在内。

如何在Containers 中也包含所有Controls

我想在 1 个或 2 个 foreach 循环中执行此操作。

【问题讨论】:

  • 它们不在控件集合中吗?
  • 不包含所有不在容器中的控件,并且将包含容器本身,但我也想选择容器中的控件。
  • ComponentResourceManager resourceManager = new ComponentResourceManager(typeof(Main)); 退出循环。

标签: c# visual-studio foreach controls


【解决方案1】:

控件

将以下类添加到您的项目中:

public static class ControlExtensionMethods
{
    public static IEnumerable<Control> GetOffsprings(this Control @this)
    {
        foreach (Control child in @this.Controls)
        {
            yield return child;
            foreach (var offspring in GetOffsprings(child))
                yield return offspring;
        }
    }
}

它将返回调用者的所有子控件:

var offsprings = this.GetOffsprings();

你可以在循环中使用它:

foreach (Control c in this.GetOffsprings())
{
    // Do action
}

菜单项

将以下类添加到您的项目中:

public static class MenuStripExtensionMethods
{
    public static IEnumerable<ToolStripItem> GetSubItems(this ToolStrip @this)
    {
        foreach (ToolStripItem child in @this.Items)
        {
            yield return child;
            foreach (var offspring in child.GetSubItems())
                yield return offspring;
        }
    }

    public static IEnumerable<ToolStripItem> GetSubItems(this ToolStripItem @this)
    {
        if (!(@this is ToolStripDropDownItem))
            yield break;

        foreach (ToolStripItem child in ((ToolStripDropDownItem) @this).DropDownItems)
        {
            yield return child;
            foreach (var offspring in child.GetSubItems())
                yield return offspring;
        }
    }
}

它将返回调用者的所有子菜单项:

var allMenuItems = this.menuStrip1.GetSubItems()

【讨论】:

  • 谢谢,它成功了,只有一个小问题,我还需要从 Menustrip 中获取 Menuitems,我如何才能访问它们及其子菜单项?
【解决方案2】:

使其递归:

private static void ApplyResources(ComponentResourceManager resourceManager,
                                   CultureInfo cultureInfo,
                                   Control container)
{
    foreach (var control in container.Controls)
    {
        resourceManager.ApplyResources(control, control.Name, cultureInfo);
        ApplyResources(resourceManager, cultureInfo, control);
    }
}

并像这样使用它:

var resourceManager = new ComponentResourceManager(typeof(Main));
var cultureInfo = new CultureInfo(lang);
ApplyResources(resourceManager, cultureInfo, this);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-26
    • 1970-01-01
    • 2012-02-03
    • 1970-01-01
    • 2011-05-18
    • 1970-01-01
    相关资源
    最近更新 更多