1

を使用してmanipulateすべてControlsを実行したいのですが、現在、次の方法を使用しています。formforeach loop

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

これに伴う問題foreachは、内のコントロールContainersが含まれていないことです。

どうすればすべてを含めることができControlsますContainersか?

foreachこれを1つまたは2つのループで実行したいと思います。

4

2 に答える 2

3

コントロール

次のクラスをプロジェクトに追加します。

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()
于 2013-03-12T13:38:08.777 に答える
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);
于 2013-03-12T13:27:47.537 に答える